Linux Socket编程之旅
随着计算机技术的发展,Linux Socket编程已经成为构建可靠网络程序的核心技术。 Socket就像一个虚拟专用电话线, 用以在不同的程序之间传输或共享数据。 通过Socket, 我们可以建立一个网络中的客户端/服务端程序, 其中客户端请求服务, 服务端返回响应。
Socket详细细分成几种, 如TCP/IP Socket、 Unix-domain Socket等等。 TCP/IP Socket是基于网络的, 我们可以在Linux中使用它来与远程客户端或服务端通信, Unix-domain Socket仅限在本机内使用。
要开始Linux Socket编程, 首先需要引入socket、sys/socket.h、netinet/in.h和arpa/inet.h这几个头文件, 并定义Socket函数数据类型用于控制socket的行为, 这些在后文中都将提到。
接下来分别编译client端和server端的代码, client端需要创建socket, 用于接收服务。 对于server端, 首先它需要绑定ip和端口(bind()函数), 然后监听客户端的连接(listen()函数), 当收到客户端的连接时, 就可以建立连接(accept()函数)、 并与客户端进行沟通(send()/ recv() 函数)。
下面以一个TCP Socket 客户端/ 服务器 程序为例:
Client端:
int main(int argc, char* argv[])
int sock_fd;// client 端socket 句柄
// 1. 创建一个socket,使用socket()函数
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0))== -1)
printf(“create socket failed!”);
printf(“Socket created!\n”);
// 2. 连接服务器
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(12345);
serv_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
if (connect(sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)

printf(” connect socket failed!”);
printf(“Connected to server!\n”);
// 3. 向服务器发数据
const char* buf = “Hello World!”;
send(sock_fd, buf, strlen(buf), 0);
// 4. 接收服务器回应
char recv_buf[1024];
memset(recv_buf, 0, sizeof(recv_buf));
if (recv(sock_fd, recv_buf, 1024, 0) == -1)
printf(” recv failed!”);
printf(“Received:%s\n”, recv_buf);
// 5. 关闭socket
close(sock_fd);
Server端:
int main(int argc, char* argv[])
int sock_fd, client_fd;
// 1. 创建socket
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0))== -1)
printf(“create socket failed!”);
printf(“Socket created!\n”);
// 2. socket 绑定ip和端口
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(12345);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind (sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
printf(“bind failed!”);
printf(“Bind Success!\n”);
// 3. 监听客户端
if (listen(sock_fd, 10) == -1)
printf(“listen failed!”);
printf(“Listening…\n”);
client_fd = accept(sock_fd, (struct sockaddr *)NULL, NULL);
printf(“Connected FROM client!\n”);
// 4. 接收数据
char recv_buf[1024];
memset(recv_buf, 0, sizeof(recv_buf));
if (recv(client_fd, recv_buf, 1024, 0) == -1)
printf(“recv failed!”);
printf(“Received:%s\n”,recv_buf);
// 5. 返回回应
const char* buf = “Thank you!”;
send(client_fd, buf, strlen(buf), 0);
// 6. 关闭套接字描述符
close(sock_fd);
close(client_fd);
上面这个例子中, 两个程序之间的通信过程已经在上面的注释中体现了, 具体的细节由发送、 接收等函数实现。 如此我们在
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
linux下socket编程中 bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)) 怎么理解
(struct sockaddr *)(&server_addr)这个是一个强制类型转换,就是将结构体&server_addr强制转换成struct sockaddr *类型。 这个是c语言范畴的东西。 因为我们只能创建和填充sockaddr_in和sockaddr_in6的结构体和里面的字段,但是很多socket参数只接受sockaddr类型的结构体,所以在这里要强制转换一下,就我记得connect()函数里也会转换一下。
linux下socket编程,只需要实现服务器端能接收多个用户端发来的消息这个功能就行,求代码,最好有相应解释
这些都是自己写的,由于我很粗心调试了好久,要是有任何问题我都可以帮你解决,包教会,而且可以进一步一起完善他的功能#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h>#include<stdlib.h>#include<sys/time.h>#define BUFF_SIZE 1024#define PORT 8888#define LSN_NUM 10int main(){ int sockfd = -1; int clt_sockfd = -1; int i = 0, fd; fd_set inset, tmp_inset; struct sockaddr_in *server_addr, *client_addr; int addr_len = sizeof(struct sockaddr_in); int len; char buff[BUFF_SIZE]; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 1){ printf(Create socket Error!\n); exit(0); }else{ printf(Create socket success! sockfd = %d\n, sockfd); } server_addr = malloc(addr_len); client_addr = malloc(addr_len); memset(server_addr, 0, sizeof(server_addr)); memset(client_addr, 0, sizeof(client_addr)); server_addr->sin_family = AF_INET; server_addr->sin_port = htons(PORT); //此处要将主机字节序转为网络字节序 server_addr->sin_addr.s_addr = INADDR_ANY; if(bind(sockfd, (struct sockaddr*)server_addr, sizeof(struct sockaddr_in)) < 0){ printf(Bind error!\n); exit(0); }else{ printf(Bind success!\n); } if(listen(sockfd, LSN_NUM) < 0){ printf(Listen error!\n); exit(0); }else{ printf(Listen success!\n); } printf(Waiting FOR connect ...\n); i = 1; FD_ZERO(&inset); FD_SET(sockfd, &inset); while(1){ printf(------ The %dth turning ------- \n, i++); tmp_inset = inset; memset(buff, 0, BUFF_SIZE); //select if(select(FD_SETSIZE, &tmp_inset, NULL, NULL, NULL) <= 0){ printf(Select failed!\n); exit(0); }else{ printf(Select success!\n); }//end select for(fd = 0; fd < FD_SETSIZE; fd++){ if(FD_ISSET(fd, &tmp_inset) > 0){ printf(crrent fd: %d\n, fd); if(sockfd == fd){ if((clt_sockfd = accept(sockfd, (struct sockaddr*)client_addr, &addr_len)) < 0){ printf(Accept error!\n); exit(0); }else{ printf(Get connection from %s, port: %d. socket: %d\n, \ inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port), clt_sockfd); } FD_SET(clt_sockfd, &inset); }else{ if((len = recv(fd, buff, BUFF_SIZE, 0)) < 0){ printf(Recv failed!\b); close(fd); FD_CLR(fd, &inset); }else if(0 == len || !strncmp(quit, buff, 4)){ printf(Clt_sockfd %d has quited!\n, clt_sockfd); close(fd); FD_CLR(fd, &inset); continue; }else{ printf(Clt_sockfd %d got Message: %s\n, clt_sockfd, buff); } } } } continue; }} free(server_addr); free(client_addr);}
linux编程 编写一个函数
看看这个是不是可以:#!/bin/kshwhile :doecho Enter Your input: (q to quit) \cread user_inputif [ $user_input == q ]thenexit 0fiecho $user_input | awk {printf(Oct: %o\nDec: %d\nHex: %x\n,$1,$1,$1);}done
发表评论