C++ 的多线程tcp的一个小问题,求解答

「已注销」 2017-07-23 01:23:16
// client test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

#define PORT 4000
#define IP_ADDRESS "127.0.0.1"


typedef struct info
{
SOCKET t_serverSocket;
sockaddr_in t_serverAddr;
}Info;

DWORD WINAPI ServerThread(LPVOID lpPara)
{
Info* t_info = (Info*)lpPara;
int ret = 0;
char RecvBufferData[MAX_PATH];
char RecvBufWho[MAX_PATH];
while (TRUE)
{

memset(RecvBufferData,0x00,sizeof(RecvBufferData));
ret = recv(t_info->t_serverSocket,RecvBufferData,MAX_PATH,0);

if(ret != 0 && ret != -1)
{
if (ret == 0 || ret == SOCKET_ERROR)
{
printf("%d",ret);
cout<<"failed,exit"<<endl;
break;
}

for (unsigned int i = 0;i < strlen(RecvBufferData);++i)
{
RecvBufferData[i] = toupper(RecvBufferData[i]);
}


memset(RecvBufWho,0x00,sizeof(RecvBufWho));
sprintf_s(RecvBufWho,"%s.%d",inet_ntoa(t_info->t_serverAddr.sin_addr),t_info->t_serverAddr.sin_port);
cout<<"接收到来自"<<RecvBufWho<<"的消息为\n"<<RecvBufferData<< endl;
Sleep(1000);
}

return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
WSADATA WSA;
SOCKET clientSocket,serverSocket;
struct sockaddr_in serverAddr;
int AddrLen = 0;
HANDLE hThread = NULL;
int ret = 0;
char SendBuffer[MAX_PATH];

if (WSAStartup(MAKEWORD(2,2),&WSA) != 0)
{
cout<<"init failed"<<endl;
return -1;
}
clientSocket = socket(AF_INET,SOCK_STREAM,0);
if (clientSocket == INVALID_SOCKET)
{
cout<<"create failed"<<endl;
return -1;
}

serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.S_un.S_addr = inet_addr(IP_ADDRESS);
serverAddr.sin_port = htons(PORT);
memset(serverAddr.sin_zero,0x00,8);
AddrLen = sizeof(serverAddr);
ret = connect(clientSocket,(struct sockaddr*)&serverAddr,AddrLen);

if (ret != 0)
{
cout<<"connect failed";
return -1;
}


serverSocket = accept(clientSocket,(struct sockaddr*)&serverAddr,&AddrLen);
cout<<"链接成功"<<endl;



Info t_info;
t_info.t_serverSocket = serverSocket;
t_info.t_serverAddr = serverAddr;
hThread = CreateThread(NULL,0,ServerThread,(LPVOID)&t_info,0,NULL);
if (hThread == NULL)
{
cout<<"create thread failed"<<endl;
}
CloseHandle(hThread);

while (TRUE)
{

cin.getline(SendBuffer,sizeof(SendBuffer));
ret = send(clientSocket,SendBuffer,(int)strlen(SendBuffer),0);

if (ret == SOCKET_ERROR)
{
cout<<"send to error"<<endl;
break;
}

}


closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}


DWORD WINAPI ServerThread(LPVOID lpPara)函数里面的RecvBufferData参数一直传不进来,是怎么回事?
...全文
234 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
表示没看懂题主提出的问题~
赵4老师 2017-07-24
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
「已注销」 2017-07-23
  • 打赏
  • 举报
回复
可以稍微具体一点吗,我之前对过,没发现错误,而且现在我时间比较紧,谢谢
战在春秋 2017-07-23
  • 打赏
  • 举报
回复
之前列出的是Server端流程。 Client端如下: 1 create a socket. 2 bind* - this is probably be unnecessary because you're the client, not the server. 3 connect to a server. 4 send/recv - repeat until we have or receive data 5 shutdown to end read/write. 6 close to releases data.
战在春秋 2017-07-23
  • 打赏
  • 举报
回复
引用
但是不行,会出错
socket编程 server/client 两方的工作过程有固定的流程。 1 create a socket - Get the file descriptor! 2 bind to an address -What port am I on? 3 listen on a port, and wait for a connection to be established. 4 accept the connection from a client. 5 send/recv - the same way we read and write for a file. 6 shutdown to end read/write. 7 close to releases data. 题目中代码并没有遵循该流程。建议找一个范例对照检查一下代码逻辑
「已注销」 2017-07-23
  • 打赏
  • 举报
回复
这个是客户端,很奇怪为什么不可以运行,服务器的收包代码和这个一样的,就可以收到。 还有一个很奇怪的地方,服务器的send函数和客户端里send函数中第一个参数一定是clientSocket才可以运行。客户端我本来以为改成serverSocket就可以了,但是不行,会出错。
		while(TRUE)
		{
			
			cin.getline(SendBuffer,sizeof(SendBuffer));
			ret = send(clientSocket,SendBuffer,(int)strlen(SendBuffer),0);
							printf("%s\n",SendBuffer);


			if (ret == SOCKET_ERROR)
			{
				cout<<"send to error"<<endl;
				break;
			}
		}

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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