TCP 基础代码
//tcp_server.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int Startup(char* ip, int port)
{printf("port: %d\n", port);struct sockaddr_in local;local.sin_family = AF_INET;local.sin_port = htons(port);local.sin_addr.s_addr = inet_addr(ip);//设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}//绑定if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){perror("bind\n");exit(3);}//监听int ret = listen(sock, 5);if(ret == -1){perror("listen_sock\n");exit(3);}return sock;
}void Server(int new_sock, char* ip, int port)
{char buf[1024];while(1){buf[0] = 0;int s = read(new_sock, buf, sizeof(buf));if(s > 0){buf[s] = 0;printf("[%s, %d] say# %s\n", ip, port, buf);write(new_sock, buf, strlen(buf));}else if(s == 0){printf("[%s, %d] quit\n", ip, port);exit(4);}else{perror("read\n");exit(5);}}
}int main(int argc, char* argv[])
{if(argc != 3){printf("Usage: %s [ip] [port]\n", argv[0]);exit(1);}//此时的套接字已经是监听套接字int listen_sock = Startup(argv[1], atoi(argv[2]));printf("listen and bind is sucessful!\n");//建立连接struct sockaddr_in peer;while(1){socklen_t len = sizeof(peer);//此时的套接字已经是监听套接字int new_sock = accept(listen_sock, (struct sockaddr*)&peer, &len);//此时返回的这个套接字就是负责服务的套接字if(new_sock == -1){printf("accept is error!\n");continue;}char* ip = inet_ntoa(peer.sin_addr);int port = ntohs(peer.sin_port);printf("get a new connet ip is %s, port is %d...\n", ip, port);//服务Server(new_sock, ip, port);//关闭文件描述符}return 0;
}
//tcp_client.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int main(int argc, char* argv[])
{if(argc != 3){printf("Usage %s [ip], [port]\n", argv[0]);exit(1);}//建立套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(atoi(argv[2]));//发起连接if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1){perror("connect\n");exit(3);}while(1){printf("Please enter#");fflush(stdout);char buf[1024];buf[0] = 0;int s = read(0, buf, sizeof(buf));if(s > 0){buf[s - 1] = 0;if(strcmp(buf, "quit") == 0){printf("client quit!\n");}write(sock, buf, strlen(buf));s = read(sock, buf, sizeof(buf) - 1);buf[s] = 0;printf("Server Echo#%s\n", buf);}}close(sock);return 0;
}
TCP 多进程多线程版本
//server.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int main(int argc, char* argv[])
{if(argc != 3){printf("Usage %s [ip], [port]\n", argv[0]);exit(1);}//建立套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(atoi(argv[2]));//发起连接if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1){perror("connect\n");exit(3);}while(1){printf("Please enter#");fflush(stdout);char buf[1024];buf[0] = 0;int s = read(0, buf, sizeof(buf));if(s > 0){buf[s - 1] = 0;if(strcmp(buf, "quit") == 0){printf("client quit!\n");}write(sock, buf, strlen(buf));s = read(sock, buf, sizeof(buf) - 1);buf[s] = 0;printf("Server Echo#%s\n", buf);}}close(sock);return 0;
}
//client.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int main(int argc, char* argv[])
{if(argc != 3){printf("Usage %s [ip], [port]\n", argv[0]);exit(1);}//建立套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(atoi(argv[2]));//发起连接if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1){perror("connect\n");exit(3);}while(1){printf("Please enter#");fflush(stdout);char buf[1024];buf[0] = 0;int s = read(0, buf, sizeof(buf));if(s > 0){buf[s - 1] = 0;if(strcmp(buf, "quit") == 0){printf("client quit!\n");}write(sock, buf, strlen(buf));s = read(sock, buf, sizeof(buf) - 1);buf[s] = 0;printf("Server Echo#%s\n", buf);}}close(sock);return 0;
}