socket通信的简单实现
来源:互联网 发布:三眼女尸 知乎 编辑:程序博客网 时间:2024/04/29 06:51
感觉socket的用法还是需要好好耐心的研究一下,先把理论的看懂,包括什么是socket,有哪些数据结构,哪些重要的函数和原理,再把人家的代码一句句看懂,最后最好自己写出来实践一下。不管的写的怎么样,总是自己的代码最好看懂。而且自己写的东西要负责,毕竟还是自己看的多。
下面是我参考人家的代码(其实都差不多),修修补补的写的一个实例,因为在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 1024int 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 clientchar 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 simultaneouslyprintf("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 1024int 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;}
0 0
- socket通信的简单实现
- 简单实现Socket通信
- Socket实现简单通信
- socket通信简单实现
- socket通信简单实现。
- PHP实现简单的socket通信
- Java实现简单的socket通信
- java实现简单的Socket通信
- C++实现简单的socket通信
- java--实现简单的socket通信
- Java Socket实现简单的即时通信
- 两个客户端通信的socket简单实现
- 简单的SOCKET通信
- 简单的Socket通信
- 简单的Socket通信
- 简单的Socket通信
- 简单的socket通信
- socket 实例实现简单通信
- 正确理解Linux内存使用
- 宁可笑着累,也不要哭着享受
- TinyXml快速入门(三)
- 百度2014校园招聘研发工程师(济南站)
- handler初探
- socket通信的简单实现
- Android存储 - SD卡或者文件存储实现
- 入门级的一个登录窗口PHP+MYSQL
- MyEclipse快捷键大全(绝对全)
- 黑马程序员_java 7k_交通灯管理系统
- JAVA不定参数探秘
- LeetCode题目 Gray Code 的解法与疑问
- 学习BluePill源码笔记-1
- Mysql 简单的命令语句续-*,as,group by,order by,group by,having,limit;