简单的,使用套接字实现TCP通信(用线程实现并发)

来源:互联网 发布:freebsd python 编辑:程序博客网 时间:2024/06/06 18:24
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include <sys/socket.h>#include <pthread.h>#define N 100#define PORT 8000void *func(void *argv){int connectfd = (int)argv;char msg[N];int n;int i;while(1){n = recvfrom(connectfd,msg,N,0,NULL,NULL);if(n == 0){printf("client is closed!\n");break;}msg[n] = '\0';printf("recv:%s",msg);for(i = 0; i < n; i++){ if(msg[i] >= 'a' && msg[i] <= 'z'){msg[i] -= 32;}}printf("send:%s",msg);sendto(connectfd,msg,n,0,NULL,0);}close(connectfd);pthread_exit(NULL);}int main(){pthread_t pid[10];int listenfd;int connectfd;struct sockaddr_in servaddr;struct sockaddr_in cliaddr;socklen_t clilen;int ret;int opt = 1;int i;int count = 0;listenfd = socket(AF_INET,SOCK_STREAM,0);if(listenfd == -1){printf("socket error!\n");exit(-1);}ret = setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));if(opt == -1){printf("setsockopt error!\n");exit(-1);}bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);ret = bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));if(ret == -1){printf("bind error!\n");exit(-1);}ret = listen(listenfd,10);if(ret == -1){printf("listen error!\n");exit(-1);}while(1){connectfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);if(ret == -1){printf("accept error!\n");exit(-1);}ret = pthread_create(&pid[count],NULL,func,(void *)connectfd);if(ret == -1){printf("pthread_create error!\n");exit(-1);}count++;}/*for(i = 0; i < count; i++){ret = pthread_join(pid[i],NULL);if(ret == -1){printf("pthread_join error!\n");exit(-1);}}printf("server is closed!\n");*/close(listenfd);    return 0;}

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include <sys/socket.h>#define N 100#define PORT 8000int main(int argc,char **argv){int sockfd;struct sockaddr_in servaddr;char sendbuf[N];char recvbuf[N];int ret;int n;if(argc != 2){printf("usage:server ip\n");exit(-1);}sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){printf("socket error!\n");exit(-1);}bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = inet_addr(argv[1]);servaddr.sin_port = htons(PORT);ret = connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));if(ret == -1){printf("connect error!\n");exit(-1);}while(fgets(sendbuf,N,stdin) != 0){sendto(sockfd,sendbuf,strlen(sendbuf),0,NULL,0);n = recvfrom(sockfd,recvbuf,N,0,NULL,NULL);recvbuf[n] = '\0';printf("recv:%s",recvbuf);}close(sockfd);    return 0;}

0 0
原创粉丝点击