void udp_server(lthread_t *lt, void *args) { struct sockaddr_in listener; struct sockaddr_in client; socklen_t listener_len = sizeof(listener); int s; int ret; char buf[64]; lthread_detach(); if ((s=lthread_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) { perror("error"); return; } memset((char *) &listener, 0, sizeof(listener)); listener.sin_family = AF_INET; listener.sin_port = htons(5556); listener.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(s, (struct sockaddr *)&listener, sizeof(listener)) == -1) { perror("Cannot bind"); return; } while (1) { ret = lthread_recvfrom(s, buf, 64, 0, (struct sockaddr *)&client, &listener_len, 1000); printf("ret returned %d: %s\n", ret, buf); } close(s); }
static int create_listener(char *ip, short port) { int fd = 0, ret = 0; int opt; struct sockaddr_in sin; fd = lthread_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (-1 == fd) { return -1; } opt = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt,sizeof(int)) == -1) { perror("failed to set SOREUSEADDR on socket"); } memset(&sin, 0, sizeof(sin)); sin.sin_family = PF_INET; sin.sin_addr.s_addr = INADDR_ANY; /*if(!inet_pton(AF_INET, ip, &sin.sin_addr)) { perror("parse ip error"); return -1; }*/ sin.sin_port = htons(port); ret = bind(fd, (struct sockaddr *)&sin, sizeof(sin)); if (-1 == ret) { close(fd); perror("cannot bind socket. closing.\n"); return -1; } ret = listen(fd, 1024); if (-1 == ret) { close(fd); perror("cannot listen on socket. closing.\n"); return -2; } return fd; }
bool TcpServer::listen(int port) { // create listening socket fd = lthread_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(fd == -1) return false; int opt = 1; if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) == -1) perror("failed to set SOREUSEADDR on socket"); sockaddr_in sin; sin.sin_family = PF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(port); // bind to the listening port int ret = bind(fd, (struct sockaddr *)&sin, sizeof(sin)); if(ret == -1) return false; ::listen(fd, 128); return true; }