2 champion lx champion_lx 于 2016.04.03 11:10 提问

C语言 socket 编写简单服务端客户端通信问题 2C

大家好,感谢你的回复。
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
Talk is cheak , show me the code.
服务端代码:

#include<stdlib.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int main(){
    WSADATA wsd;
    SOCKET sockServer;
    SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    SOCKET sockClient;
    SOCKADDR_IN clientaddr;
    WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket


    if (sockServer != -1 && sockServer != INVALID_SOCKET){
        printf("Socket has been created :%d", sockServer);
    }
    else{
        printf("Socket create failed.");
        exit(0);
    }
    serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(6000);//绑定端口6000
    int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    char recvBuf[100];
    int len = sizeof(SOCKADDR);
    listen(sockServer, 5);//5为等待连接数
    while (1){
        sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
        //接收客户端数据
        recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
        printf("to me:%s\n",recvBuf);
        memset(recvBuf, 0, 100);
    }
    closesocket(sockClient);
    system("pause");
    return 0;
}

客户端代码:

 #include<winsock2.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
    WSADATA wsaData;
    SOCKET sockClient;//客户端Socket
    SOCKADDR_IN addrServer;//服务端地址
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    char message[20] = "HelloSocket!";
    //定义要连接的服务端地址
    addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(6000);//连接端口6000
    //新建客户端socket
    sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    int s = 0;
    s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));

    while (1){
        //发送数据
        int a = send(sockClient, message, strlen(message) + 1, 0);
        printf("to server:");
        scanf("%s", message);

    }
    //关闭socket
    closesocket(sockClient);
    WSACleanup();
}

求懂的高手来解答一下。
谢谢了!

5个回答

CSDNXIAOD
CSDNXIAOD   2016.04.03 11:22

安卓手机socket通信(服务端和客户端)
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

champion_lx
champion_lx 我想问下,原理是每次都要connect吗?
2 年多之前 回复
lmy0930
lmy0930   2016.04.03 12:08

你接收端只接收了一次消息就关闭了socket,所以只能一次,要反复接受消息应该在收的部分循环

champion_lx
champion_lx 那是个无限循环,...
2 年多之前 回复
doubleintfloat
doubleintfloat   2016.04.03 13:36

应该用多线程或者多进程,,,过两天给你源代码

champion_lx
champion_lx 好的,谢谢你,我弄的这个单线程的也可以,但是找不到原因
2 年多之前 回复
champion_lx
champion_lx   2016.04.03 21:06

我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

zuoakang
zuoakang   2016.04.07 14:47

你的recv错的吧,它每次都返回一个实际长度,所以,每次接收完,都要把接收的数组最后以为设置为0,表示结束。

champion_lx
champion_lx 你看我改的对吗? 不明白具体是什么意思
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java与c语言之间的socket通信—c客户端java服务器端
写在前面的声明:程序例子均运行在ubuntu(是一个以桌面应用为主的Linux操作系统)上。当然你也可以把java运行在其它系统上,这里只是为了方便。 上一篇文章已经说明了关于socket的一些知识,but这是远远不够的,我相信只要你感兴趣,学习它并不是什么难事。 好吧,我想你已经迫不及待地想看看 c客户端 java 服务器端通信是什么样子了,我也是; 同样的这只是一个小实例,不过你同样可以
Socket——实现简单的一对一服务器端与客户端聊天功能
server.c/* Socket head file */ #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h>/*sockaddr_in{} */ #include<arpa/inet.h>/* Unix standard head file */ #include<stdio.h> #include<stdlib
Windows C语言 UDP编程 server端(服务器、客户端)--初级(简单版)
UDP协议全称是用户数据报协议[1] ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使
C语言 Socket入门示例1—— 单工通信(客户端向服务器发送消息)
如果对Windows API不太熟悉、对TCP/IP通信协议不太熟悉,或者对C语言本身不太熟悉的话,学习Socket会有点难受的。以前学习操作系统的时候,被API吓怕了,很多莫名其妙的API有着多如牛毛的参数,令人费解。学习计算机网络的时候,又有那么多的协议,并且很多协议本身比较复杂,什么三次握手建立连接,什么四次握手释放链接等等,也没有学得特别透彻。更遗憾的是,以前学C的时候,误以为自己把C学会
C语言实现socket通信
实现客户端、服务器相互通信功能,在telnet连接localhost可以成功收发消息
c语言socket双向通信+一服务端对多客户端通信
c语言实现socket双向通信和一个服务端与多个客户端之间的通信
java与c语言之间的socket通信—java客户端c服务器端
做一个项目
C++ Socket编程 实现服务端与客户端的通讯(Windows)
建议浏览:C++ Socket编程步骤  以及 c++中Socket编程代码样例:C++ socket编程 实现服务端与客户端的通讯简单补充:进行WINSOCK编程时,需要引入两个库文件:WINSOCK.H(这个是WINSOCK API的头文件,WIN2K以上支持WINSOCK2,所以可以用WINSOCK2.H)Ws2_32.lib(WINSOCK API连接库文件)使用方式如下:      
linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
一、介绍基于TCP协议通过socket实现网络编程常用API 1、读者如果不是很熟悉,可以先看我之前写的几篇博客,有socket,地址结构的理解,更加方便读者理解 地址分别是: 1)、http://blog.csdn.net/u011068702/article/details/56479927 2)、http://blog.csdn.net/u011068702/article/de
C语言实现服务器与客户端的socket通信运行在linux系统中 .
下面将编写一个c/s结构的程序,主要功能是client将向server发送一些消息,而当server收到client的请求时,并向client发送一条回应信息。 server.c代码如下: [cpp] view plaincopyprint? #include    #include    #include    #include    #include