C++socket如何实现服务器端在接收到信息以后,自动返回一个值给客户端

凤梨头头 2015-03-09 10:14:44
我现在的代码只能实现客户端发送信息,然后服务器端接受信息,但是我想在服务器端接收到信息以后,可以自动返回一个字符串给客户端,希望可以指点一下,万分感谢~!!!
服务器端代码:
#include <WINSOCK2.H>
#include <stdio.h>

#define PORT 5150
#define MSGSIZE 1024

#pragma comment(lib, "ws2_32.lib")

int main()
{
WSADATA wsaData;
SOCKET sListen;
SOCKET sClient;
SOCKADDR_IN local;
SOCKADDR_IN client;
char szMessage[MSGSIZE];
int ret;
int iaddrSize = sizeof(SOCKADDR_IN);
WSAStartup(0x0202, &wsaData);

sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN));

listen(sListen, 1);

sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize);
printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr),
ntohs(client.sin_port));

while (TRUE) {
ret = recv(sClient, szMessage, MSGSIZE, 0);
szMessage[ret] = '\0';
printf("Received [%d bytes]: '%s'\n", ret, szMessage);
}
return 0;
}
客户端代码:
#include <WINSOCK2.H>
#include <stdio.h>

//定义程序中使用的常量
#define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址
#define PORT 5150 //服务器的端口号
#define MSGSIZE 1024 //收发缓冲区的大小
#pragma comment(lib, "ws2_32.lib")

int main()
{
WSADATA wsaData;
//连接所用套节字
SOCKET sClient;
//保存远程服务器的地址信息
SOCKADDR_IN server;
//收发缓冲区
char szMessage[MSGSIZE];
//成功接收字节的个数
int ret;

// Initialize Windows socket library
WSAStartup(0x0202, &wsaData);

// 创建客户端套节字
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //AF_INET指明使用TCP/IP协议族;
//SOCK_STREAM, IPPROTO_TCP具体指明使用TCP协议
// 指明远程服务器的地址信息(端口号、IP地址等)
memset(&server, 0, sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0
server.sin_family = PF_INET; //声明地址格式是TCP/IP地址格式
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
connect(sClient, (struct sockaddr *) &server, sizeof(SOCKADDR_IN));
while (TRUE) {
printf("Send:");
//从键盘输入
gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage
// 发送数据
send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度
}

// 释放连接和进行结束工作
closesocket(sClient);
WSACleanup();
return 0;
}
...全文
866 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxway 2015-03-09
  • 打赏
  • 举报
回复
服务端:
while (TRUE) {      
        ret = recv(sClient, szMessage, MSGSIZE, 0);      
        send();
        szMessage[ret] = '\0';      
        printf("Received [%d bytes]: '%s'\n", ret, szMessage);      
    }      
客户端:

printf("Send:");      
        //从键盘输入      
        gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage      
        // 发送数据      
        send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度
        recv()
这样就可以了呀,把参数填写到send及recv函数中。看楼主的程序应该会死循环,没看出来什么条件下退出循环。
凤梨头头 2015-03-09
  • 打赏
  • 举报
回复
引用 6 楼 qiaoba0701 的回复:
为什么不用CreateThread.....
我刚接触socket通信,我查了哈你说的这个函数是多线程,请问下可以指点一哈吗?就是我在五楼的那个疑问,为什么重复运行会出错的,我想知道是哪里出错了,谢谢了~!!!我刚接触这方面,不是很了解!!!
qiaoba0701 2015-03-09
  • 打赏
  • 举报
回复
为什么不用CreateThread.....
凤梨头头 2015-03-09
  • 打赏
  • 举报
回复
引用 1 楼 mxway 的回复:
服务端:
while (TRUE) {      
        ret = recv(sClient, szMessage, MSGSIZE, 0);      
        send();
        szMessage[ret] = '\0';      
        printf("Received [%d bytes]: '%s'\n", ret, szMessage);      
    }      
客户端:

printf("Send:");      
        //从键盘输入      
        gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage      
        // 发送数据      
        send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度
        recv()
这样就可以了呀,把参数填写到send及recv函数中。看楼主的程序应该会死循环,没看出来什么条件下退出循环。
恩恩,我想请问一下,我现在想统计我的客户端程序运行的时间和服务器端程序运行的时间,想利用for循环,通过多次重复运算统计,可是我填加for循环却不能重复运行程序,会提示出错,应该怎么解决?谢谢了~!!! 我试图进行重复运行程序统计时间的修改代码: 用户端: while (TRUE) { printf("Send:"); //从键盘输入 gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage // 发送数据 //计算程序运行时间 clock_t start,finish; double totaltime; start=clock(); for(int i=0;i<100;i++) { send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度 ret=recv(sClient,szMessage, MSGSIZE, 0); szMessage[ret] = '\0'; } finish=clock(); totaltime=(double)(finish-start)/CLOCKS_PER_SEC; cout<<"\n此程序的运行时间为"<<totaltime<<"秒!"<<endl; printf("Received [%d bytes]: '%s'\n", ret, szMessage); break; } 服务器端: char buffer[1024]; strcpy(buffer,"123456"); while (TRUE) { ret = recv(sClient, szMessage, MSGSIZE, 0); szMessage[ret] = '\0'; printf("Received [%d bytes]: '%s'\n", ret, szMessage); //计算程序运行时间 clock_t start,finish; double totaltime; start=clock(); for(int i=100;i<100;i++) { send(sClient,buffer,strlen(buffer),0); } //计算程序运行时间 finish=clock(); totaltime=(double)(finish-start)/CLOCKS_PER_SEC; cout<<"\n此程序的运行时间为"<<totaltime<<"秒!"<<endl; break; }
凤梨头头 2015-03-09
  • 打赏
  • 举报
回复
引用 3 楼 cheng7068 的回复:
你的while死循环没有sleep,这样死循环很快会让cpu使用率高起来,而且你的死循环没有任何的结束条件
恩恩,我想请问一下,我现在想统计我的客户端运行程序的时间和服务器端运行程序的时间,可是我填加for循环却不能重复运行程序,会提示出错,应该怎么解决?谢谢了~!!! 我试图进行重复发送统计时间的修改代码: 用户端: while (TRUE) { printf("Send:"); //从键盘输入 gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage // 发送数据 //计算程序运行时间 clock_t start,finish; double totaltime; start=clock(); for(int i=0;i<100;i++) { send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度 ret=recv(sClient,szMessage, MSGSIZE, 0); szMessage[ret] = '\0'; } finish=clock(); totaltime=(double)(finish-start)/CLOCKS_PER_SEC; cout<<"\n此程序的运行时间为"<<totaltime<<"秒!"<<endl; printf("Received [%d bytes]: '%s'\n", ret, szMessage); break; } 服务器端: char buffer[1024]; strcpy(buffer,"123456"); while (TRUE) { ret = recv(sClient, szMessage, MSGSIZE, 0); szMessage[ret] = '\0'; printf("Received [%d bytes]: '%s'\n", ret, szMessage); //计算程序运行时间 clock_t start,finish; double totaltime; start=clock(); for(int i=100;i<100;i++) { send(sClient,buffer,strlen(buffer),0); } //计算程序运行时间 finish=clock(); totaltime=(double)(finish-start)/CLOCKS_PER_SEC; cout<<"\n此程序的运行时间为"<<totaltime<<"秒!"<<endl; break; }
风行踩火轮 2015-03-09
  • 打赏
  • 举报
回复
你的while死循环没有sleep,这样死循环很快会让cpu使用率高起来,而且你的死循环没有任何的结束条件
凤梨头头 2015-03-09
  • 打赏
  • 举报
回复
引用 1 楼 mxway 的回复:
服务端:
while (TRUE) {      
        ret = recv(sClient, szMessage, MSGSIZE, 0);      
        send();
        szMessage[ret] = '\0';      
        printf("Received [%d bytes]: '%s'\n", ret, szMessage);      
    }      
客户端:

printf("Send:");      
        //从键盘输入      
        gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage      
        // 发送数据      
        send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度
        recv()
这样就可以了呀,把参数填写到send及recv函数中。看楼主的程序应该会死循环,没看出来什么条件下退出循环。
恩恩,是会进入死循环。服务器端send函数的参数应该是客户端的IP地址和端口号吗?你的意思是给客户端再设定一个端口号和IP地址吗?

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧