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;

C语言socket编程要怎么实现服务器可以发消息给客户端?
》我现在只能。客户端发个消息给服务器。服务器才能发个消息给客户端。也就是说客户端不发消息。服务器就没法发消息给客户端。》求大牛给个思路。当连接后。客户端与服务器双方可以随时随地通信!使用多线程,一个维持接受逻辑,一个维持送信逻辑,即可完成同时接受及发送。客户端及服务器端均做上述设...

如何用C语言实现向某个IP发送数据包(例如4个浮点数)?
2、下面用Socket实现一个windows下的c语言socket通信例子,这里客户端传递一个字符串,服务器端进行接收。【服务器端】include "stdafx.h"include <stdio.h> include <winsock2.h> include <winsock2.h> define SERVER_PORT 5208 \/\/侦听端口 void main(){ WORD wVersionRequested;WSADATA wsaData;int ...

保护隐私?漫画C语言socket聊天软件详解
监听客户端请求通过listen函数实现,根据需要设置最大连接数。当有客户端请求连接时,使用accept接收请求,随后可以使用recv或send函数发送和接收数据。完成通信后,通过closesocket关闭socket。客户端的编写与服务端类似,但需要通过connect函数连接服务器。与服务端的通信流程相同,包括接收和发送数据,最后关闭连...

C语言 socket编程 客户端只send一次 但是服务器会循环执行这条命令...
recv(comm_socket,recv_buff, sizeof(recv_buff), 0); \/*receiveclient's command*\/ 改成 int ret = recv(comm_socket,recv_buff, sizeof(recv_buff), 0); \/*receiveclient's command*\/ if ret == -1 || ret == 0 break == -1 表示出错, =0 表示 socket 已经关闭。

socket客户端收不到服务端消息c++
不要使用命名空间std。在c++软件中,socket客户端运行中,收不到服务端的任何消息,不要使用命名空间std即可解决,C++是C语言的继承。

c语言socket编程
最简单的方法,发送方在发送完成后,close这个socket,接收方自然就会recv 0 bytes了,另外,receive程序里最好写成 if (nNumRead <= 0)break;

c语言报文转发脚本怎么写
与socket通讯有两种方式,一种是建立长连接,建立后不停的发送,接收;另一种是建立短连接,即建立连接发送报文,接收报文关闭连接 1.2 Socket协议发送的buf类型介绍 Send buffer类型分为字符串和xml类型 1.3 Socket协议脚本编写前提:与项目组沟通,确认是否是socket协议,由项目组提供服务器IP和端口号...

C 语言socket 的send数据太大,最大能发送多少?如何分批发送?
是这样,如果是UDP传输,一般就是1500左右。如果是TCP大小不一定,比如你要传10000,有可能一次传的量是小于10000的任意量。为了解决这个问题,我建议你用阻塞的SOCKET ,TCP传输,用一个循环接收一个大数据包,每次接到多少字节就将内存下表移动多少,在下次循环中继续接受,直到传完一个整包。

Linux C语言 C\/S程序,客户端发送的数据和服务器端接收到的数据不一...
每次1字节。解决办法有两种:改用udp socket,send\/recv自然对等了 继续用tcp socket,自己进行数据分段:比如自行约定在数据前约定4个字节用于描述数据长度,这样发送时,send 4+33字节,send 4+35字节;接收时,先获取描述长度的4字节获得长度,再按照长度接收数据(可能需要多次recv凑齐指定长度)。

如何用C语言编写一个简单的聊天室程序
客户端发生消息给服务器(消息+聊天室编号)服务器根据客户端上传的聊天室编号广播消息 客户端接受服务器传来的消息 用到的技术就是socket编程(应该有其他的现成的框架,不过我用得比较多的是java,不清楚c的),如果还想做个界面的话,可以用qt做,或者MFC,应该还有其他可选方式,不过我不知道~~~...

相似回答