tcp server side
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define MAXLINE 512 #define SERV_PORT 8000 int main(void) { struct sockaddr_in servaddr, chiaddr; socklen_t cliaddr_len; int listenfd, connfd; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int i, n; listenfd = socket(AF_INET, SOCK_STREAM,0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); listen(listenfd, 20); connfd = accept(listenfd, (struct sockaddr*)&chiaddr, &cliaddr_len); while (1) { printf("Accepting connections ... \n"); cliaddr_len = sizeof(chiaddr); memset(buf,0,sizeof(buf)); n = recv (connfd,buf,sizeof(buf),0); //n = read(connfd, buf, MAXLINE); printf("size n %d\n",sizeof(n)); printf("receive form %s at Port %d data:",inet_ntop(AF_INET, &chiaddr.sin_addr, str, sizeof(str)), ntohs(chiaddr.sin_port)); /*for (i=0; i<n; i++) { buf[i] = toupper(buf[i]); //printf("%s\n",buf[i]); }*/ //write(1, buf, n); printf("%s\n",buf); if(!(strcmp(buf,"bye"))) { break; } } close(connfd); return 0; } |
tcp client side
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define MAXLINE 80 #define SERV_PORT 8000 int main(int argc, char *argv[]) { struct sockaddr_in servaddr; char buf[MAXLINE]; int sockfd, n; char str[512]; /*if (argc !=2) { fputs("usage:./client message \n", stderr); exit(1); } str = argv[1]; */ sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); servaddr.sin_port = htons(SERV_PORT); connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); while(1) { memset(str,0,sizeof(str)); printf("input data to sent= "); scanf("%s",&str); printf("data len= %d\n",sizeof(str)); //fgets(str,strlen(str),stdin); //write(sockfd, str, sizeof(str)); n = send(sockfd,str,strlen(str),0); //n = read(sockfd, buf, MAXLINE); //printf("Response from the serve:\n"); //write (STDOUT_FILENO, buf, n); if(!(strcmp(str,"bye"))) { break; } } close(sockfd); return 0; } |
以下是支援持續連線的server及client, 當client斷線時,server會斷線後,再建立新的連線
tcp_server.c
#define MAXLINE 512 int recv_handle(int connfd) //cliaddr_len = sizeof(chiaddr); if(!(strcmp(buf,"bye"))) return 0; int main(void) bzero(&servaddr, sizeof(servaddr)); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); listen(listenfd, 20); while(1) { recv_handle(connfd); |
tcp_client.c
#include <stdio.h> #define SERV_PORT 8000 #define MAXNAME 512 /* exit(1); if (bind(fd, (struct sockaddr *)&myaddr, bzero((char *)&servaddr, sizeof(servaddr)); hp = gethostbyname("127.0.0.1"); */ while(1){ memset(data , 0 , sizeof(data)); if (send(fd, data, sizeof(data), 0) == -1) { if(!strcmp(data,"bye")) close (fd); |
makefile
all:tcp_server tcp_client tcp_server:tcp_server.c gcc $^ -o $@ tcp_client:tcp_client.c gcc $^ -o $@ clean: rm -rf tcp_server tcp_client *.o |