简单的stream socket例子

本文提供了一个简单的Stream Socket通信示例,包括服务器端和客户端的实现。服务器端开启监听等待连接,客户端发起连接并进行数据交互。通过这个例子,读者可以了解Stream Socket基本的网络通信流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器端:

#include<stdio.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<stdlib.h>
int main(){
	int sock_server, sock_client;
	struct sockaddr_in server_addr, client_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(6666);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);  //inet_addr("127.0.0.1")
	sock_server = socket(AF_INET, SOCK_STREAM, 0);
	if(sock_server < 0){
		printf("server socket create error!\n");
		exit(1);		
	}
	int server_len = sizeof(server_addr);
	if(bind(sock_server, (struct sockaddr*)&server_addr, server_len) < 0){
		printf("bind server socket error\n");
		exit(0);
	}
	if(listen(sock_server, 5) < 0){
		printf("serever socket listen error\n");
		exit(1);
	}
	while(1){
//		printf("wait\n");
		int client_len = sizeof(client_addr);
		sock_client = accept(sock_server, (struct sockaddr*)&client_addr, (socklen_t*)&client_len);
		if(sock_client < 0){
			printf("Accept error\n");
			exit(1);
		}
//		printf("Accepted\n");
		int pid = fork();
		if(pid == 0){
			char buf[100];
			recv(sock_client, buf, 100, 0);
			printf("Message from client: %s\n", buf);
			send(sock_client, "Hello client", 100, 0);
			struct sockaddr_in server;
			server_len = sizeof(server);
			getsockname(sock_client, (struct sockaddr*)&server, (socklen_t*)&server_len);
			char local_addr[20];
			if(inet_ntop(AF_INET, (void*)&server.sin_addr, local_addr, sizeof(local_addr))){
//				printf("转换成功\n");
				printf("information: %s %d\n", local_addr, ntohs(server.sin_port));
			}
			else
				printf("地址转换失败\n");
//			printf("AAA\n");
			while(1)  //不调用close(),导致tcp状态一直处于close_wait状态
				;
			close(sock_client);
		}
	}
	close(sock_server);
	return 0;
}



客户端:

#include<stdio.h>
#include<netinet/in.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>
int main(){
	int sock_server, sock_client;
	struct sockaddr_in server_addr, client_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(6666);
	server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	sock_client = socket(AF_INET, SOCK_STREAM, 0);
	if(sock_client < 0){
		printf("client socket create error!\n");
		exit(1);		
	}
	if(connect(sock_client, (struct sockaddr*)&server_addr, sizeof(server_addr)) != -1){
			printf("client success");
			char buf[100] = "Hello server";
			send(sock_client, buf, 100, 0);
			recv(sock_client, buf, 100, 0);
			printf("Message from server: %s\n", buf);
			int client_len = sizeof(client_addr);
			while(1)
				;
			close(sock_client);
	}else{
		printf("Connect error\n");
		exit(1);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值