socket通信的问题

yphui18 yphui18 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
好像阻塞了,请高手帮忙看看.
socket服务端的代码
/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(void){
struct sockaddr_in servaddr;//服务端地址
struct sockaddr_in cliaddr;//客户端地址
socklen_t cliaddr_len; //客户端长度
int listenfd;//监听端口的文件描述符
int connfd;//
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i, n;
listenfd = socket(AF_INET, SOCK_STREAM, 0); //创建socket文件描述
bzero(&servaddr, sizeof(servaddr)); //
servaddr.sin_family = AF_INET; //TCP IP
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //监听的地址
servaddr.sin_port = htons(SERV_PORT);//监听的端口
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));//把文件描述符与端口进行绑定
listen(listenfd, 20); //开始监听
printf("Accepting connections111 ...\n");
while (1)
{
printf("one step...\n");
cliaddr_len = sizeof(cliaddr);
printf("two step...\n");
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); //这里第二次accept好像阻塞了
printf("three step...\n");
n = read(connfd, buf, MAXLINE);
printf("received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));
for (i = 0; i < n; i++) buf[i] = toupper(buf[i]);
write(connfd, buf, n);

}
close(connfd);
}

客户端的代码

/* client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char *argv[]){
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n; char *str;
if (argc != 2) {
fputs("usage: ./client message\n", stderr); exit(1);
}
str = argv[1];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(1)
{
memset(buf, 0, 20);
printf("buf is %d \n",buf);
printf("begin write\n");
write(sockfd, str, strlen(str));
printf("one step\n");
n = read(sockfd, buf, MAXLINE); //这里第二次read也阻塞了
printf("two step\n");
printf("Response from server:\n");
write(STDOUT_FILENO, buf, n);
printf("\n end write\n");
}
printf("begin close\n");
close(sockfd);
return 0;
}


运行socket客户端程序
./client aa
buf is 804396960
begin write
one step
two step
Response from server:
AA
end write
buf is 804396960
begin write
one step

运行socket服务端程序

./serv
Accepting connections111 ...
Accepting connections222 ...
one step...
two step...
three step...
received from 127.0.0.1 at PORT 58845
one step...
two step...



...全文

相关推荐

Socket通信,通过异步,解决粘包问题

Socket通信,通过异步,解决粘包问题

shixing09120928

Java Socket通信介绍及可能遇到的问题解决

最近在学习Java中的Socket通信,所以下面这篇文章主要给大家介绍了关于Java Socket通信介绍及可能遇到问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。

weixin_38706603

Python中的Socket 与 ScoketServer 通信及遇到问题解决方法

Socket有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢。其中【recv(1024)】表示从缓冲区里取最大为1024个字节,但实际取值大小是不确定的,推荐其值小于等于8192。 黏包问题: Socket发送两条连续数据时,可能最终会拼接成一条进行发送 解决方法一: 两条数据间进行延时发送,如【tiem.sleep(0.5) #延时0.5s】 解决方法二: 每次发送后等待对方确认接收信息数据,发送一条后就立即接收等待 解决方法三: 设定接收数据大小,发送端每次发送需要发送的数据的数据大小,接收端通过设置【recv(xx)】只接

weixin_38722184

java和as3 socket通信 解决安全沙箱问题

NULL 博文链接:https://renzaihangzhou.iteye.com/blog/2007855

weixin_38669628

java Socket与C#通信中中文乱码问题的解决方案

近正在做一个项目,其中遇到了一个问题是java与.NET之间的通信问题。具体的问题是这样的:   客户端使用java,服务器端使用的是C#。两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端传过来的都是乱码。于是上网查,希望可以找到解决方法,可是,网上有好多的答案,经过了很多的实验,都不能很好的解决。没办法只能靠自己一点一点的排查了。   经过一番努力,终找到了原因:C#和java的编码方式不同。虽然找到了原因,但是网上关于这个问题的答案也是百家争鸣,在这里给出源代码,希望对大家有帮助。   首先是客户端的java代码(这是比较简单的部分) im

weixin_38645373
评论 12
收藏 已收藏
分享
返回顶部
yphui18
C++ 语言 65,214 成员 250,514 内容