大脚叔偿谈:Linux C Socket网络Demo(TCP/IP)

话不多讲,直接复制,直接编译。
第一步,服务端: tcp_server.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char*argv[]){
    int server_sockfd; // 服务器端套接字
    int client_sockfd; // 客户端套接字
    struct sockaddr_in my_addr; // 服务器网络地址结构体
    struct sockaddr_in remote_addr; // 客户端网络地址结构体
    char buf[BUFSIZ]; // 数据传送的缓冲区
    int len, sin_size = sizeof(struct sockaddr_in);
    // 数据初始化--清零
    memset(&my_addr,0,sizeof(my_addr)); 
    my_addr.sin_family = AF_INET; // 设置为IP通信
    my_addr.sin_addr.s_addr = INADDR_ANY; // 服务器IP地址--允许连接到所有本地地址上
    my_addr.sin_port = htons(12380); // 服务器端口号
    // 创建服务器端套接字--IPv4协议,面向连接通信,TCP协议 
    if(0 > (server_sockfd = socket(PF_INET,SOCK_STREAM,0))) {
        perror("socket");
        return 1;
    }
    // 将套接字绑定到服务器的网络地址上
    if(0 > bind(server_sockfd,(struct sockaddr*)&my_addr, sizeof(struct sockaddr))) {
        perror("bind");
        return 1;
    }
    // 监听连接请求--监听队列长度为1
    listen(server_sockfd, 1);
    printf("listening now, wait client accept!\n");
    // 等待客户端连接请求到达
    if(0 > (client_sockfd = accept(server_sockfd,(struct sockaddr*)&remote_addr, &sin_size))) {
        perror("accept");
        return 1;
    }
    printf("accept client %s\n", inet_ntoa(remote_addr.sin_addr));
    // 发送欢迎信息
    // len = sprintf(buf, "Welcome to my server\n");
    // send(client_sockfd, buf, len,0);
    // 接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数
    while( 9 > 1 ) {
    	len = recv(client_sockfd, buf, BUFSIZ, 0);
    	if ( 0 > len ) break;
		buf[len] = '\0';
        printf("%s\n",buf);
        if(0 > send(client_sockfd,buf,len,0)) {
            perror("send");
            return 1;
        }
    }
    close(client_sockfd);
    close(server_sockfd);
    return 0;
}

第二步,终端: tcp_client.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
	struct sockaddr_in remote_addr; // 服务器端网络地址结构体
	char buf[BUFSIZ]; // 数据传送的缓冲区
	int len, client_sockfd;
	// 数据初始化--清零
	memset(&remote_addr, 0, sizeof(remote_addr));
	remote_addr.sin_family = AF_INET; // 设置为IP通信
	remote_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址
	remote_addr.sin_port = htons(12380); // 服务器端口号
	// 创建客户端套接字--IPv4协议,面向连接通信,TCP协议
	if (0 > (client_sockfd = socket(PF_INET, SOCK_STREAM, 0)) ) {
		perror("socket");
		return 1;
	}
	// 将套接字绑定到服务器的网络地址上
	if (0 > connect(client_sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr))) {
		perror("connect");
		return 1;
	}
	printf("connected to server\n");
	// 循环的发送接收信息并打印接收信息--recv返回接收到的字节数,send返回发送的字节数
	while ( 9 > 1 ) {
		printf("Enter string to send:");
		scanf("%s", buf);
		if (!strcmp(buf, "quit")) break;
		len = send(client_sockfd, buf, strlen(buf), 0);
		// 接收服务器端信息
		len = recv(client_sockfd, buf, BUFSIZ, 0);
		buf[len] = '\0';
		printf("received:%s\n", buf);
	}
	close(client_sockfd);	   // 关闭套接字
	return 0;
}

最后,结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值