socket通信的简单实现
2014-06-28 13:18
387 查看
感觉socket的用法还是需要好好耐心的研究一下,先把理论的看懂,包括什么是socket,有哪些数据结构,哪些重要的函数和原理,再把人家的代码一句句看懂,最后最好自己写出来实践一下。不管的写的怎么样,总是自己的代码最好看懂。而且自己写的东西要负责,毕竟还是自己看的多。
下面是我参考人家的代码(其实都差不多),修修补补的写的一个实例,因为在Linux下的socket实现比较容易,更容易帮助理解socket的用法和原理。但是功能也比较简单,写的不清楚的请不吝赐教!
server.c
client.c
下面是我参考人家的代码(其实都差不多),修修补补的写的一个实例,因为在Linux下的socket实现比较容易,更容易帮助理解socket的用法和原理。但是功能也比较简单,写的不清楚的请不吝赐教!
server.c
/* * Filename: server.c * version 1.0 * Author : Halfish * Last edit time: March 2nd, 2014 */ #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include <sys/socket.h> // for socket #include <stdio.h> // for printf #include <errno.h> // for errno #include <stdlib.h> // for exit #include <string.h> // for memset #define SERVER_PORT 6666 #define LENGTH_OF_LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 int main(int argc, char const *argv[]) { // 设置一个服务器端的socket地址结构server_addr,代表服务器internet地址, 端口 struct sockaddr_in server_addr; int server_socket_fd; // 服务器端的文件描述符 // define buffer to receive/send string from/to client char buffer_receive[BUFFER_SIZE]; memset(buffer_receive, 0, BUFFER_SIZE); char buffer_send[BUFFER_SIZE]; memset(buffer_send, 0, BUFFER_SIZE); /* * try to initialize to server address */ memset(&server_addr, 0, sizeof(server_addr)); //把一段内存区的内容全部设置为0 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(SERVER_PORT); /* * try to creat a server socket */ server_socket_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_socket_fd == -1) { // only return -1 means fail and set errno simultaneously printf(" Failed to creat a socket for server...\n"); printf(" (errno: %d) %s\n", errno, strerror(errno) ); return 1; } else { printf(" Successfully creat a socket for server...\n"); } /* * try to bind the server_socket_fd and server_addr */ if( bind(server_socket_fd,(struct sockaddr*)&server_addr, sizeof(server_addr) ) == -1) { // only return -1 means fail and set errno simultaneously printf(" Failed to bind this port: %d \n", SERVER_PORT); printf(" (errno: %d) %s\n", errno, strerror(errno) ); return 1; } else { // only bind returns 0 means bind successfully ?! printf(" Bind successfully\n"); } /* * the server begins to listen */ if ( listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE) == -1) { printf(" Failed to listen..."); printf(" (errno: %d) %s \n", errno, strerror(errno)); return 1; } else { printf(" Server is listening...\n"); } /* * begin connections to multiple clients */ while(1) { struct sockaddr_in client_address; socklen_t length = sizeof(client_address); /* * * 接受一个到server_socket代表的socket的一个连接 * 如果没有连接请求,就等待到有连接请求--这是accept函数的特性 * accept函数返回一个新的socket,这个socket(new_server_socket_fd)用于同连接到的客户的通信 * new_server_socket_fd代表了服务器和客户端之间的一个通信通道 * accept函数把连接到的客户端信息填写到客户端的socket地址结构client_address中 * */ int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_address, &length); if ( new_server_socket_fd < 0) { printf(" Failed to accept a connection from to client!\n"); printf(" (errno: %d) %s\n", errno, strerror(errno) ); break; } else { printf(" Accepted a client successfully\n"); } // Thread added here // accepted connection, begin a dead loop to receive information from one specific client while(1) { /* * recieve data from client */ memset(buffer_receive, 0, BUFFER_SIZE); length = recv(new_server_socket_fd, buffer_receive, BUFFER_SIZE, 0); if (length < 0) { printf(" Failed to recieve data from client. \n" ); printf(" (errno: %d) %s\n", errno, strerror(errno) ); continue; } else { printf(" Client said:"); printf(" %s\n", buffer_receive); } /* * scanf from stdin continuously and send to client simutaneously */ printf(" Server(it's me) said: "); memset(buffer_send, 0, BUFFER_SIZE); scanf("%s", buffer_send); if (send(new_server_socket_fd, buffer_send, sizeof(buffer_send), 0) < 0) { printf(" Failed to send data to client. \n" ); printf(" (errno: %d) %s\n", errno, strerror(errno) ); continue; } } // end of while(1) close(new_server_socket_fd); } close(server_socket_fd); return 0; }
client.c
/* * Filename: client.c * version 1.0 * Author : Halfish * Last edit time: March 2nd, 2014 */ #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include <sys/socket.h> // for socket #include <stdio.h> // for printf #include <errno.h> // for errno #include <stdlib.h> // for exit #include <string.h> // for memset #define SERVER_PORT 6666 #define BUFFER_SIZE 1024 int main(int argc, char const *argv[]) { if (argc != 2) { printf(" You must tell me the address of server! \n"); return 0; } /* * initilize client */ int client_socket_fd = socket(AF_INET,SOCK_STREAM,0); if (client_socket_fd == -1) { // only return -1 means fail and set errno simultaneously printf(" Failed to creat a socket for client.\n"); printf(" (errno: %d) %s\n", errno, strerror(errno) ); return 1; } else { printf(" Successfully initilize the client !\n"); } /* * initilize server address */ struct sockaddr_in server_address; memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; if (inet_aton(argv[1],&server_address.sin_addr) == 0) // inet_aton() = address to number { printf(" Server's IP address error!\n"); printf(" (errno: %d) %s\n", errno, strerror(errno) ); return 1; } server_address.sin_port = htons(SERVER_PORT); socklen_t server_addr_length = sizeof(server_address); /* * begin to connect to server */ if ( connect(client_socket_fd, (struct sockaddr*) &server_address, server_addr_length) == -1) { printf(" Can not connect to %s!\n", argv[1]); printf(" (errno: %d) %s\n", errno, strerror(errno) ); return 1; } else { printf(" Successfully connect to server! \n"); } /* * define buffer to receive/send string from/to server */ char buffer_receive[BUFFER_SIZE]; char buffer_send[BUFFER_SIZE]; memset(buffer_receive, 0, BUFFER_SIZE); memset(buffer_send, 0, BUFFER_SIZE); strcpy(buffer_send, " I am the client, can you hear me ? "); if (send(client_socket_fd, buffer_send, sizeof(buffer_send), 0) < 0) { printf(" Failed to send data to client. \n" ); printf(" (errno: %d) %s\n", errno, strerror(errno) ); return 0; } // accepted connection, begin a dead loop to receive information from one specific client int i = 1; while(i) { printf("%d\n", i); ++ i; /* * recieve data from server */ memset(buffer_receive, 0, BUFFER_SIZE); socklen_t length = sizeof(server_address); length = recv(client_socket_fd, buffer_receive, BUFFER_SIZE, 0); if (length < 0) { printf(" Failed to recieve data from server. \n" ); printf(" (errno: %d) %s\n", errno, strerror(errno) ); continue; } else { printf(" Server said:"); printf(" %s\n", buffer_receive); } /* * scanf from stdin continuously and send to server simutaneously */ printf(" Client(it's me) said: "); memset(buffer_send, 0, BUFFER_SIZE); scanf("%s", buffer_send); if (send(client_socket_fd, buffer_send, sizeof(buffer_send), 0) < 0) { printf(" Failed to send data to server. \n" ); printf(" (errno: %d) %s\n", errno, strerror(errno) ); continue; } } // end of while(1) close(client_socket_fd); return 0; }
相关文章推荐
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- [000]socket通信--server和client实现的简单例子
- Android网络编程之Socket通信实现简单聊天室
- C# 如何实现简单的Socket通信(附示例) 推荐
- 利用socket TCP协议实现客户端与服务端简单通信
- linux下socket实现TCP通信的简单程序接口封装
- [001]socket通信--server和client实现迭代的简单例子
- C语言实现socket简单通信实例
- Android笔记——Socket通信实现简单聊天室
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- socket 实例实现简单通信
- 【转】 C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- 基于socket简单通信协议实现
- Java 利用套接字Socket实现简单的服务器与客户端通信
- 基于socket简单通信协议实现
- 基于socket简单通信协议实现
- 基于socket简单通信协议实现(c/c++)
- 基于socket简单通信协议实现(c/c++)
- Java简单实现Socket非阻塞通信