Linux 网络编程 简单例程1


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



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 2

int 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_ANY
	server_addr.sin_port = htons(PORT);            // 指定端口号

	err = bind(ss, (struct sockaddr *)&server_addr, sizeof(server_addr));   // 绑定套接字  强制类型转换 sockaddr_in -> sockaddr
	if (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 8885

int 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);
		}
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值