服务器和客户端建立连接,发送消息 可以用 telnet server_host_ip port 来测试连接,如 telnet 192.169.1.11 5678 服务端程序 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <string.h> #include <arpa/inet.h> #define MYPORT 3490 /* the port users will be connecting to */ #define BACKLOG 10 /* how many pending connections queue will hold */ #define STRSIZE 64 main() { char strEcho[32] = "Get your message!/n"; int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* my address information */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; int len; char str[STRSIZE] = {0}; int count = 0; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) / == -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } printf("服务端启动/n"); while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, / &sin_size)) < 0 ) { perror("accept"); continue; } printf("server: got connection from %s/n", / inet_ntoa(their_addr.sin_addr)); if (!fork()) { if (write(new_fd, "Hello, world!/n", 14, 0) == -1) perror("send"); /*连接验证*/ bzero(str, STRSIZE); len = recv(new_fd, str, STRSIZE, 0); if (len < 0) { printf("failed/n"); } else if (strcmp(str, "psw") != 0) { printf("验证无效/n"); close(new_fd); exit(0); } else { printf("验证通过/n"); } while (1) { write(new_fd, strEcho, strlen(strEcho), 0); bzero(str, STRSIZE); len = read(new_fd, str, STRSIZE, 0); if (len > 0) { printf("接收到:%s from %s/n", str, inet_ntoa(their_addr.sin_addr)); /* write(new_fd, strEcho, strlen(strEcho), 0);*/ } else { printf("fail"); break; } if (strcmp(str, "bye") == 0) { break; } } close(new_fd); exit(0); } close(new_fd); /* parent doesn't need this */ while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ } } ======= 客户端程序 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 3490 /* the port client will be connecting to */ #define MAXDATASIZE 100 /* max number of bytes we can get at once */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; /* connector's address information */ int len; if (argc != 2) { fprintf(stderr,"usage: client hostname/n"); exit(1); } if ((he = gethostbyname(argv[1])) == NULL) { /* get the host info */ herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(PORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */ if (connect(sockfd, (struct sockaddr *)&their_addr, / sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } if ((numbytes = read(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); exit(1); } buf[numbytes] = '/0'; printf("Received: %s",buf); while (1) { bzero(buf, MAXDATASIZE); printf("put in the massage:"); scanf("%s", buf); len = write(sockfd, buf, strlen(buf), 0); if (len > 0) { printf("send/n"); if (numbytes = read(sockfd, buf, MAXDATASIZE, 0) == -1) {exit(1);} buf[numbytes] = '/0'; printf("%d hi %s",numbytes, buf); } else { printf("fail/n"); break; } } printf("client close/n"); close(sockfd); return 0; }