1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h>
#include<stdlib.h> #include<stdio.h> #include<errno.h> #include<string.h>
#define ERR_EXIT(m)\ do\ {\ perror(m); \ exit(EXIT_FAILURE); \ }while (0)
int main(void) { int listenfd; if ((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) ERR_EXIT("socket");
struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5188); inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
int on = 1; if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) ERR_EXIT("SETSOCKOPT") ;
if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) ERR_EXIT("BIND");
if (listen(listenfd, SOMAXCONN) < 0) ERR_EXIT("LISTEN");
struct sockaddr_in peeraddr; socklen_t peerlen = sizeof(peeraddr); int conn; if ((conn = accept(listenfd, (struct sockaddr*)&peeraddr, &peerlen)) < 0) ERR_EXIT("ACCEPT");
char ip_addr[INET_ADDRSTRLEN] = {0}; printf("ip=%s port=%d\n", inet_ntop(AF_INET, &peeraddr.sin_addr, ip_addr, INET_ADDRSTRLEN), ntohs(peeraddr.sin_port));
char recvbuf[1024]; while (1) { memset(recvbuf, 0, sizeof(recvbuf)); int ret = read(conn, recvbuf, sizeof(recvbuf)); fputs(recvbuf, stdout); write(conn, recvbuf, ret); }
close(conn); close(listenfd) ;
return 0; }
|