在Linux下基于tcp协议实现一个简单的通信

来源:互联网 发布:php网页自动生成html 编辑:程序博客网 时间:2024/06/06 03:04

1.server端

#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#include<arpa/inet.h>#include<sys/wait.h>#include<stdlib.h>#include<pthread.h>static void usage(const char* proc){printf("usage: %s [ip] [port]\n",proc);}void* thread_run(void* arg){printf("create a new thread\n");int fd = (int)arg;char buf[1024];while(1){memset(buf,'\0',sizeof(buf));ssize_t _s = read(fd,buf,sizeof(buf) - 1);if(_s > 0){buf[_s] = '\0';printf("client# %s\n",buf);write(fd,buf,strlen(buf));}else if(_s == 0){printf("client close...\n");break;}else{printf("read done...\n");break;}}return (void*)0;}int main(int argc,char* argv[]){if(argc != 3){usage(argv[0]);exit(1);}int listen_sock = socket(AF_INET,SOCK_STREAM,0);if(listen_sock < 0){perror("socket");return 1;}struct sockaddr_in local;local.sin_family = AF_INET;local.sin_port = htons(atoi(argv[2])); //argv[2]local.sin_addr.s_addr = inet_addr(argv[1]); //argv[1]if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local)) < 0){perror("bind");return 2;}listen(listen_sock,5);//4.acceptstruct sockaddr_in peer;socklen_t len = sizeof(peer);while(1){int fd = accept(listen_sock,(struct sockaddr*)&peer,&len);if(fd < 0){perror("accept");return 3;}printf("get a new link,socket -> %s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));pthread_t id;pthread_create(&id,NULL,thread_run,(void*)fd);pthread_detach(id);//pid_t id = fork();//if(id == 0)//{//char buf[1024];//while(1)//{//memset(buf,'\0',sizeof(buf));//ssize_t _s = read(fd,buf,sizeof(buf) - 1);//if(_s > 0)//{// buf[_s] = '\0';//printf("client# %s\n",buf);//write(fd,buf,strlen(buf));//}//else//{//   printf("read done...\n");//break;//}//}//}//else //father//{//waitpid(-1,NULL,WNOHANG);//}//    char buf[1024];//while(1)//{//memset(buf,'\0',sizeof(buf));//ssize_t _s = read(fd,buf,sizeof(buf) - 1);//if(_s > 0)//{//    buf[_s] = '\0';//printf("client# %s\n",buf);//write(fd,buf,strlen(buf));//}//else//{//    printf("read done...\n");//break;//}//}}return 0;}

  1).创建套接字

  2).绑定端口

  3).监听状态

  4).accept


2.client端


#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#include<arpa/inet.h>#include<sys/wait.h>#include<stdlib.h>#include<pthread.h>static usage(const char* proc){printf("usage: %s [ip] [port]\n",proc);}int main(int argc,char* argv[]){if(argc != 3){usage(argv[0]);exit(1);}int sock = socket(AF_INET,SOCK_STREAM,0);if(sock < 0){perror("socket");return 2;}struct sockaddr_in remote;remote.sin_family = AF_INET;remote.sin_port = htons(atoi(argv[2]));remote.sin_addr.s_addr = inet_addr(argv[1]);if(connect(sock,(struct sockaddr*)&remote,sizeof(remote))< 0){perror("connect");return 3;}char buf[1024];while(1){memset(buf,'\0',sizeof(buf));printf("Please Enter: ");fflush(stdout);ssize_t _s = read(0,buf,sizeof(buf) - 1);if(_s > 0){buf[_s - 1] ='\0';write(sock,buf,strlen(buf));_s = read(sock,buf,sizeof(buf));if(_s > 0){buf[_s] = '\0';printf("%s\n",buf);}}}return 0;}

  1).创建套接字

  2).主动连接


3.测试



         以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。


0 0
原创粉丝点击