TCP 编程

来源:互联网 发布:简谱打谱软件 mac版 编辑:程序博客网 时间:2024/06/01 09:45

服务器端:

#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <netinet/in.h>#define PORT            4321#define BUFFER_SIZE        1024#define MAX_QUE_CONN_NM   5int main(){     struct sockaddr_in server_sockaddr,client_sockaddr;     int sin_size,recvbytes;     int sockfd, client_fd;     char buf[BUFFER_SIZE];          /*建立socket 连接*/     if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)     {          perror("socket");          exit(1);     }     printf("Socket id = %d\n",sockfd);          /*设置 sockaddr_in 结构体相关参数*/     server_sockaddr.sin_family = AF_INET;     server_sockaddr.sin_port = htons(PORT);     server_sockaddr.sin_addr.s_addr = INADDR_ANY;   //任意地址     bzero(&(server_sockaddr.sin_zero), 8);          int i = 1;/* 允许重复使用本地地址与套接字进行绑定 */     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));          /*绑定函数bind()*/     if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1)  //0.0.0.0为广播地址,也就是任意地址的意思,但是你无法设置其它电脑上的端口方式,最后的结果就是进行了本机设置。     {          perror("bind");          exit(1);     }     printf("Bind success!\n");          /*调用listen()函数创建未处理请求的队列*/     if (listen(sockfd, MAX_QUE_CONN_NM) == -1)     {          perror("listen");          exit(1);     }     printf("Listening....\n");          /*调用accept() 函数,等待客户端的连接*/     if ((client_fd = accept(sockfd,                   (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)     {          perror("accept");          exit(1);     }          /*调用recv() 函数接受客户端的请求*/     memset(buf , 0, sizeof(buf));     if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)     {          perror("recv");          exit(1); }     printf("Received a message: %s\n", buf);     close(sockfd);     exit(0);}

 

客户端:

#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   4321#define BUFFER_SIZE 1024int main(int argc, char *argv[]){     int sockfd,sendbytes;     char buf[BUFFER_SIZE];     struct hostent *host;     struct sockaddr_in serv_addr;          if(argc < 3)     {          fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");          exit(1);     }          /*地址解析函数*/     if ((host = gethostbyname(argv[1])) == NULL)     {          perror("gethostbyname");          exit(1);     }          memset(buf, 0, sizeof(buf));     sprintf(buf, "%s", argv[2]);          /*创建socket*/     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)     {          perror("socket");          exit(1);     }          /*设置sockaddr_in 结构体相关参数*/     serv_addr.sin_family = AF_INET;     serv_addr.sin_port = htons(PORT);     serv_addr.sin_addr = *((struct in_addr *)host->h_addr);     bzero(&(serv_addr.sin_zero), 8);          /*调用connect 函数主动发起对服务器端的连接*/     if(connect(sockfd,(struct sockaddr *)&serv_addr,                                    sizeof(struct sockaddr))== -1)     {          perror("connect");          exit(1);     }          /*发送消息给服务器端*/     if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)     {          perror("send");          exit(1);     }     close(sockfd);     exit(0);}