C语言Socket服务器怎么给客户端发消息

服务器

#include<winsock2.h>
#include<stdio.h>
#include<conio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
SOCKET sockServer;
SOCKADDR_IN addrServer;
SOCKET sockClient;
SOCKADDR_IN addrClient;
WSAStartup(MAKEWORD(2, 2), &wsaData);
sockServer = socket(AF_INET, SOCK_STREAM, 0);
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY表示任何IP
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(6000);//绑定端口6000
bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));

//Listen监听端
listen(sockServer, 5);//5为等待连接数目
printf("服务器已启动:\n监听中...\n");
int len = sizeof(SOCKADDR);
char sendBuf[100]="BYE";//发送至客户端的字符串
char recvBuf[100];//接受客户端返回的字符串

//会阻塞进程,直到有客户端连接上来为止
sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len);
//接收并打印客户端数据
recv(sockClient, recvBuf, 100, 0);
printf("%s\n", recvBuf);

send(sockServer, sendBuf, 100, 0);
//关闭socket
closesocket(sockClient);

WSACleanup();
_getch();
return 0;
}

客户端
#include<winsock2.h>
#include<stdio.h>
#include<conio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
SOCKET sockClient;//客户端Socket
SOCKADDR_IN addrServer;//服务端地址
WSAStartup(MAKEWORD(2, 2), &wsaData);
//新建客户端socket
sockClient = socket(AF_INET, SOCK_STREAM, 0);
//定义要连接的服务端地址
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
//连接到服务端
connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
//发送数据
char message[20] = "HelloSocket!";
char lzfwq[20];
send(sockClient, message, strlen(message) + 1, 0);

SOCKET sockServer;
int len = sizeof(SOCKADDR);
sockServer = accept(sockClient, (SOCKADDR*)&addrServer, &len);
recv(sockServer, lzfwq, 100, 0);
printf("%s", lzfwq);

//关闭socket
closesocket(sockClient);
WSACleanup();
getch();
return 0;
}

你的文件中的问题
// 会阻塞进程,直到有客户端连接上来为止
// 既然是直到有客户端连接上,那么就要弄明白哪个是与客户端连接的套接字
// sockClient就是与客户端连接的套接字
sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len);
//接收并打印客户端数据
recv(sockClient, recvBuf, 100, 0);
printf("%s\n", recvBuf);
// 所以此处,应该把sockServer改为sockClient
send(/*sockServer*/sockClient, sendBuf, 100, 0);

PS:服务器客户端通信,是要保持服务器与客户端的连接。
而不能这样立即关闭,如果设置不对,立即关闭,缓冲区的数据是会丢失的。那客户端也就不会再收到数据了。
你可以加Sleep(10000);来测是通信过程
//关闭socket
closesocket(sockClient);
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-08-03
最好的方法是:每一客户端用唯一的ID来标示, 就像QQ号一样, 在客户端连接服务器,发送自己的ID, 然后和相应产生的SOCKET进行绑定, 一个客户端向另一个客户端发送信息时,要求在数据包里包含对方的ID号。可以定义一个类型下列的数据结构对数据包进行封装:
type struct _sdata {
int sourceID;//发送者自己的ID
int destID; //接收者的ID
char datainfo[1];//数据信息
}SDATA, *PSDATA;
相似回答