你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

linux socket编程指北

2021/12/27 16:31:08

linux socket编程指北

以下server和client的c代码均拷贝自博客,详细内容请阅读原文。在其上添加了错误码打印,修改了服务端ip和端口,并增加了makefile脚本。

server

/*serve_tcp.c*/
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include <netinet/ip.h>

int main(){
	//创建套接字
	int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	//初始化socket元素
	struct sockaddr_in serv_addr;
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr("192.168.140.132");
	serv_addr.sin_port = htons(8888);
	# 设置ip头部里的tos值或者DSCP值
	unsigned char  service_type = 0xe0;
    if(setsockopt(sock, SOL_IP/*IPPROTO_IP*/, IP_TOS, (void *)&service_type, sizeof(service_type)) < 0) {
            printf("setsockopt(IP_TOS) failed:\n");
    }
	//绑定文件描述符和服务器的ip和端口号
	bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

	//进入监听状态,等待用户发起请求
	listen(serv_sock, 20);
	//接受客户端请求
	//定义客户端的套接字,这里返回一个新的套接字,后面通信时,就用这个clnt_sock进行通信
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size = sizeof(clnt_addr);
	int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

	//接收客户端数据,并相应
	char str[256];
	read(clnt_sock, str, sizeof(str));
	printf("client send: %s\n",str);
	strcat(str, "+ACK");
	write(clnt_sock, str, sizeof(str));

	//关闭套接字
	close(clnt_sock);
	close(serv_sock);

	return 0;
}
  • makefile
all:
	gcc -g server.c -o server
clean:
	rm -rf server

client

/*client_tcp.c*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include <errno.h>
#include <netinet/ip.h>

int main(){
	//创建套接字
	int sock = socket(AF_INET, SOCK_STREAM, 0);

	//服务器的ip为本地,端口号1234
	struct sockaddr_in serv_addr;
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr("192.168.140.132");
	serv_addr.sin_port = htons(8888);
    # 设置ip头部里的tos值或者DSCP值
	unsigned char  service_type = 0xe0;
    if(setsockopt(sock, SOL_IP/*IPPROTO_IP*/, IP_TOS, (void *)&service_type, sizeof(service_type)) < 0) {
            printf("setsockopt(IP_TOS) failed:\n");
    }
	int ret = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    if (ret ) {
           printf("connect failed, errno is %d\n", errno);
           exit(0);
    }
	//发送并接收数据
	char buffer[40];
	printf("Please write:");
	scanf("%s", buffer);
	write(sock, buffer, sizeof(buffer));
	read(sock, buffer, sizeof(buffer) - 1);
	printf("Serve send: %s\n", buffer);

	//断开连接
	close(sock);

	return 0;
}
  • makefile
all:
	gcc -g client.c -o client
clean:
	rm -rf cleint

运行

#先运行服务端
./server
#再运行客户端
./client

注意:若客户端在连接过程中出现错误码为113的连接失败情况,需将防火墙关闭(使用localhost不会出现该问题)。如centos使用如下命令关闭:

 systemctl stop firewalld.service

reference

  1. https://blog.csdn.net/weixin_41249411/article/details/89060985