linux 网络阻塞现象,linux 网络编程【2】 基本阻塞通信

本文展示了如何使用C语言实现一个简单的TCP/IP通信,包括客户端和服务器端。客户端通过socket()创建套接字,connect()连接到服务器的指定IP和端口,发送消息后关闭连接。服务器端通过socket()创建套接字,bind()绑定本地地址和端口,listen()开始监听,accept()接收客户端连接,recv()读取并打印接收到的数据,最后关闭连接。
摘要由CSDN通过智能技术生成

Client 端代码:

--------------------------

/* sockclnt.c*/

#include

#include

#include

#include

#include /*for struct sockaddr_in*/

#define DEST_IP "65.52.207.217"

#define DEST_PORT 4000

int main()

{

int res;

int sockfd;

struct sockaddr_in dest_addr;

char *msg = "Hello world\n";

int len, bytes_sent;

/* 取得一个套接字*/

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd == -1) {

perror("socket()");

exit(1);

}

/* 设置远程连接的信息*/

dest_addr.sin_family = AF_INET; /* 注意主机字节顺序*/

dest_addr.sin_port = htons(DEST_PORT); /* 远程连接端口, 注意网络字节顺序*/

dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); /* 远程 IP 地址, inet_addr() 会返回网络字节顺序*/

bzero(&(dest_addr.sin_zero), 8); /* 其余结构须置 0*/

/* 连接远程主机,出错返回 -1*/

res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));

if (res == -1) {

perror("connect()");

exit(1);

}

len = strlen(msg);

bytes_sent = send(sockfd, /* 连接描述符*/

msg, /* 发送内容*/

len, /* 发关内容长度*/

0); /* 发送标记, 一般置 0*/

/* 关闭连接*/

close(sockfd);

}

Server 端的代码:

-----------------------------------------------------

/* socksrv.c*/

#include

#include

#include

#include

#include

#include /* for struct sockaddr_in*/

#define BACKLOG 10

#define MYPORT 4000

int main()

{

char *addr;

int sockfd;

int new_fd;

struct sockaddr_in my_addr, their_addr;

int res;

int sin_size;

char *buf;

/* 取得套接字描述符*/

sockfd = socket(AF_INET, /* domain*/

SOCK_STREAM, /* type*/

0); /* protocol*/

if (sockfd == -1) {

perror("socket");

exit(1);

}

/* Init sockaddr_in */

my_addr.sin_family = AF_INET; /* 注意: 应使用主机字节顺序*/

my_addr.sin_port = htons(MYPORT); /* 注意: 应使用网络字节顺序*/

my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */

bzero(&(my_addr.sin_zero), 8); /* 结构的其余的部分须置 0*/

/* 指定一个套接字使用的地址及端口*/

res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));

if (res == -1) {

perror("bind");

exit(1);

}

/* 监听请求, 等待连接*/

res = listen(sockfd,

BACKLOG); /* 未经处理的连接请求队列可容纳的最大数目*/

if (res == -1) {

perror("listen");

exit(1);

}

/* 接受对方的连接请求, 建立连接,返回一个新的连接描述符.

* 而第一个套接字描述符仍在你的机器上原来的端口 listen()

*/

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (void *)&their_addr, &sin_size);

buf = (char *)malloc(255);

if (buf == NULL) {

printf("malloc failed\n");

exit(1);

}

/* 接受对方发来的数据*/

res = recv(new_fd, buf, 255, 0);

if (res == -1) {

perror("recv()");

exit(1);

}

/* 关闭本次连接*/

close(new_fd);

/* 关闭系统监听*/

close(sockfd);

printf("recv data:%s\n", buf);

free(buf);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值