- #include <stdio.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #define MAXPENDING 5 /* max client requests */
- #define BUFFSIZE 32
- int die(char *mess) {fprintf(stdout, mess); return 1;}
- int handle_client(int sock) {
- char buffer[BUFFSIZE];
- int received = -1;
-
-
- {
- if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
- die("Failed to receive initial bytes from client/n");
- }
- }
- buffer[received] = '/0';
-
- while (received > 0) {
- fprintf(stdout, "Recieve: %s/n", buffer);
-
- if (send(sock, buffer, received, 0) != received) {
- die("Failed to send bytes to client/n");
- }
-
-
- if ((received = recv(sock, buffer, BUFFSIZE, 0)) < 0) {
- die("Failed to receive additional bytes from client/n");
- }
- buffer[received] = '/0';
- }
-
- return 0;
- }
- int tcp_server_4(short port)
- {
- int server_sock,client_sock,maxfd;
- struct sockaddr_in server,client;
- int received = 0;
- fd_set fdR,fdR2;
- int ret = 0;
-
- if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- return die("Failed to create tcp server socket/n");
- }
-
- memset(&server, 0, sizeof(server));
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = htonl(INADDR_ANY);
- server.sin_port = htons(port);
-
- if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
- return die("Failed to bind the server socket./n");
- }
-
- if (listen(server_sock, MAXPENDING) < 0) {
- return die("Failed to listen on server socket/n");
- }
-
- FD_ZERO(&fdR);
- FD_ZERO(&fdR2);
-
- FD_SET(server_sock, &fdR2);
- maxfd = server_sock;
- while (1) {
-
- fdR = fdR2;
-
- fprintf(stdout, "Select intoi: fd [%d]/n", maxfd);
- ret = select(maxfd+1, &fdR, NULL,NULL,NULL);
- if (ret < 0) {
- return die(" select fail");
- }
- fprintf(stdout, "Select a fd/n");
-
- if (FD_ISSET(server_sock, &fdR)) {
- int len = sizeof(client);
- client_sock = accept(server_sock, (struct sockaddr *)&client, &len);
- FD_SET(client_sock, &fdR2);
- if (maxfd < client_sock) {
- maxfd = client_sock;
- }
- }
- else if (FD_ISSET(client_sock, &fdR)) {
-
- handle_client(client_sock);
- close(client_sock);
- FD_CLR(client_sock, &fdR2);
- }
- }
- return 0;
- }
- int tcp_server_3(short port)
- {
- int server_sock,client_sock;
- struct sockaddr_in server,client;
- int received = 0;
-
-
- if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- return die("Failed to create tcp server socket/n");
- }
-
- memset(&server, 0, sizeof(server));
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = htonl(INADDR_ANY);
- server.sin_port = htons(port);
-
- if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
- return die("Failed to bind the server socket./n");
- }
-
-
- if (listen(server_sock, MAXPENDING) < 0) {
- return die("Failed to listen on server socket/n");
- }
-
- while (1) {
- unsigned int clientlen = sizeof(client);
- pid_t pid;
-
- if ((client_sock = accept(server_sock, (struct sockaddr *)&client, &clientlen)) < 0) {
- return die("Failed to accept client connection/n");
- }
-
- fprintf(stdout, "client connect ID:%d: %s/n", getpid(),inet_ntoa(client.sin_addr));
- pid = fork();
- if (0 == pid) {
- close(server_sock);
- handle_client(client_sock);
- fprintf(stdout, "I'am child , i will die./n");
- close(client_sock);
- return 0;
- } else {
- close(client_sock);
- }
- }
- return 0;
- }
- int tcp_server_2(short port)
- {
- int server_sock,client_sock;
- struct sockaddr_in server,client;
- int received = 0;
-
-
- if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- return die("Failed to create tcp server socket/n");
- }
-
- memset(&server, 0, sizeof(server));
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = htonl(INADDR_ANY);
- server.sin_port = htons(port);
-
- if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
- return die("Failed to bind the server socket./n");
- }
-
-
- if (listen(server_sock, MAXPENDING) < 0) {
- return die("Failed to listen on server socket/n");
- }
-
- while (1) {
- unsigned int clientlen = sizeof(client);
- pid_t pid;
- pid = fork();
- if (0 == pid) {
-
- if ((client_sock = accept(server_sock, (struct sockaddr *)&client, &clientlen)) < 0) {
- return die("Failed to accept client connection/n");
- }
- fprintf(stdout, "client connect at pid:%d, ID:%d: %s/n", pid,getpid(),inet_ntoa(client.sin_addr));
- handle_client(client_sock);
- close(client_sock);
- fprintf(stdout, "I'am child , i will die./n");
- return 0;
- }
- }
- return 0;
- }
- int tcp_server_1(short port)
- {
- int server_sock,client_sock;
- struct sockaddr_in server,client;
- int received = 0;
-
-
- if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- return die("Failed to create tcp server socket/n");
- }
-
- memset(&server, 0, sizeof(server));
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = htonl(INADDR_ANY);
- server.sin_port = htons(port);
-
- if (bind(server_sock, (struct sockaddr *)(&server), sizeof(server)) < 0) {
- return die("Failed to bind the server socket./n");
- }
-
- if (listen(server_sock, MAXPENDING) < 0) {
- return die("Failed to listen on server socket/n");
- }
-
- while (1) {
- unsigned int clientlen = sizeof(client);
-
- if ((client_sock = accept(server_sock, (struct sockaddr *)&client, &clientlen)) < 0) {
- return die("Failed to accept client connection/n");
- }
- fprintf(stdout, "client connect: %s/n", inet_ntoa(client.sin_addr));
- handle_client(client_sock);
- close(client_sock);
- }
- return 0;
- }
- int main(int argc, char *argv[])
- {
- int sock;
-
- if (argc != 3)
- {
- fprintf(stderr, "USAGE: tcp_server_test <mode> <Port>/n");
- return 1;
- }
-
- switch (argv[1][0]) {
- case '1':
- return tcp_server_1((short)atoi(argv[2]));
- case '2':
- return tcp_server_2((short)atoi(argv[2]));
- case '3':
- return tcp_server_3((short)atoi(argv[2]));
- case '4':
- return tcp_server_4((short)atoi(argv[2]));
- default:
- fprintf(stderr, "USAGE: tcp_server_test <mode> <Port>/n");
- }
- return 0;
- }
- #include <stdio.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #define BUFFSIZE 32
- int die(char *mess) {fprintf(stdout, mess); return 1;}
- int tcp_client_1(const char *ipaddr, short port, const char *message)
- {
- int sock;
- struct sockaddr_in server;
- char buffer[BUFFSIZE];
- unsigned int len;
- int received = 0;
-
-
- if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- die("Failed to create tcp socket/n");
- }
-
- memset(&server, 0, sizeof(server));
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = inet_addr(ipaddr);
- server.sin_port = htons(port);
-
- if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
- die("Failed to connect with server/n");
- }
-
-
- len = strlen(message);
- if (send(sock, message, len, 0) != len) {
- die("Mismatch in number of send bytes/n");
- }
- fprintf(stdout, "Success to send message[%s]./n", message);
- received = 0;
- while (received < len) {
- int bytes = 0;
- if ((bytes = recv(sock, buffer, BUFFSIZE-1, 0)) < 1) {
- die("Failed to receive bytes from server/n");
- }
- received += bytes;
- buffer[bytes] = '/0';
- fprintf(stdout, "Receive message[%s]./n", buffer);
- }
- fprintf(stdout, "/n");
- close(sock);
- return 0;
- }
- int main(int argc, char *argv[])
- {
- int sock;
- int i = 0;
- char buffer[BUFFSIZE];
-
- if (argc != 4)
- {
- fprintf(stderr, "USAGE: tcp_client_test <Server IP> <Port> <message>/n");
- exit(1);
- }
-
- while (1) {
- memset(buffer, 0, sizeof(buffer));
- sprintf(buffer, "%s: %d", argv[3], i);
- tcp_client_1(argv[1], (short)atoi(argv[2]), buffer);
- i++;
- sleep(2);
- }
- }
注释比较少,有什么地方不懂得,一起讨论。与代码对应的内容介绍可以参看这篇文章http://blog.csdn.net/mythfish/archive/2008/08/01/2753132.aspx