玩一下linux网络编程之TCP程序

972 篇文章 329 订阅
148 篇文章 34 订阅

        Windows网络编程和linux网络编程我都玩, 之前的网络编程博文主要是基于Windows的, 后来一些朋友说博文中很少linux网络编程, 好吧, 姑且写一篇来玩一下。 要说明的是, linux才是网络编程的始祖, Windows不过是借鉴和改造而已。 对程序员来讲, 虽然两种环境下的网络编程有很多细微差别, 但还是有很多相通之处。

       说明奋斗奋斗奋斗: 部分网友事后反馈, 本博文中的程序编译不过, 应该是在不同的linux环境下依赖的头文件不完全一致得意得意得意, 所以, 这里我来给个比较全面的linux网络编程头文件列表:

 

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>

 

 

        不必纠结, 开始。 服务端程序为:

 

#include<sys/socket.h>
#include<netinet/in.h>

#include <stdio.h>
#include <string.h>

int main()
{
	// 创建用于监听的socket
	int sockSrv = socket(AF_INET, SOCK_STREAM, 0);

	// 本地地址信息
	struct sockaddr_in addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_addr.s_addr = INADDR_ANY; 
	addrSrv.sin_port = htons(8888);

	// socket与本地地址绑定
	bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));

	// 设置socket为监听状态
	listen(sockSrv, 5);

	struct sockaddr_in addrClient;
	int len = sizeof(struct sockaddr_in);

	// 等待接受客户端来连接, sockConn是用来与客户端通信的socket(请注意区分用于监听的addrSrv和用于通信的sockConn这两个socket)
	int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, &len);
	
	 // 将客户端的IP地址保存下来, 并把数据返回客户端
	char szSendBuf[100] = {0};
	snprintf(szSendBuf, sizeof(szSendBuf), "hello %s, hello client.", inet_ntoa(addrClient.sin_addr));
	send(sockConn, szSendBuf, strlen(szSendBuf) + 1, 0); 

	getchar(); // 卡住
	
	close(sockConn);
	close(sockSrv);
	
	return 0;
}

        编译, 无error无warning(不同linux机器,可能不一样哈), 启动它。

 

 

        再来看客户端程序:

 

#include<sys/socket.h>
#include<netinet/in.h>

#include <stdio.h>

int main()
{
        int sockClient = socket(AF_INET, SOCK_STREAM, 0);

        struct sockaddr_in addrSrv;
        addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1");
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(8888);
        connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));

        char szRecvBuf[100] = {0};
        recv(sockClient, szRecvBuf, sizeof(szRecvBuf) - 1, 0);
        printf("%s\n", szRecvBuf);

        getchar();

        close(sockClient);

        return 0;
}

 

        编译, 无error无warning(不同linux机器,可能不一样哈), 启动它。客户端的结果为:

 

[taoge@localhost ~]$ gcc client.c 
[taoge@localhost ~]$ ./a.out 
hello 127.0.0.1, hello client.

 

        几行代码实战胜过千言万语的啰嗦, OK,  就这样。   (注意: 如上代码如果保存在cpp文件中用g++编译, 会提示少头文件, 加上即可微笑

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值