Linux 网络编程 简单例程1

来源:互联网 发布:数据库排序 编辑:程序博客网 时间:2024/06/08 05:37


目的:编写简单的服务器到客户端通信小程序。



1. 服务端代码

/************ * servise.c   服务端程序源码 */#include <stdio.h>#include <stdlib.h>#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <linux/in.h>#define PORT 8885#define BACKLOG 2int main(int argc, char *argv[]){int ss, sc;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int err;pid_t pid;ss = socket(AF_INET, SOCK_STREAM, 0);if (ss < 0){perror("socket error!");return -1;}bzero(&server_addr, sizeof(server_addr));      // 清零server_addr.sin_family=AF_INET;                // 指定协议server_addr.sin_addr.s_addr=htonl(INADDR_ANY); // htonl() 函数 主机到网络字节序转换   指定地址为INADDR_ANYserver_addr.sin_port = htons(PORT);            // 指定端口号err = bind(ss, (struct sockaddr *)&server_addr, sizeof(server_addr));   // 绑定套接字  强制类型转换 sockaddr_in -> sockaddrif (err < 0){printf("listen error!\n");return -1;}err = listen(ss, BACKLOG);  // 启动监听 if (err < 0){printf("listen error!\n");return -1;}for(;;) {int addrlen = sizeof(struct sockaddr);sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);  //接受客户端连接if (sc < 0){continue;}pid=fork();if (pid == 0){close(ss);process_conn_server(sc);   // 服务端处理函数}else{close(sc);}}}


2. 客户端代码

#include <stdio.h>#include <stdlib.h>#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <linux/in.h>#define PORT 8885int main(int argc, char *argv[]){int s;struct sockaddr_in server_addr;int err;s = socket(AF_INET, SOCK_STREAM, 0);if (s < 0){printf("socket error!\n");return -1;}bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(PORT);inet_pton(AF_INET, argv[1], &server_addr.sin_addr);  // inet_pton() 字符串格式转换到2进制connect(s, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));  // 建立连接process_conn_client(s);  // 客户端处理程序close(s);}

3. 处理程序

#include <stdio.h>#include <string.h>void process_conn_server(int s){ssize_t size = 0;char buffer[1024];for(;;) {size = read(s, buffer, 1024);if (size == 0){return ;}sprintf(buffer, "%d bytes altogether\n", size);write(s, buffer, strlen(buffer)+1);}}void process_conn_client(int s){ssize_t size = 0;char buffer[1024];for(;;){size = read(0, buffer, 1024);if (size > 0){write(s, buffer, size);size = read(s, buffer, 1024);write(1, buffer, size);}}}