+ -
当前位置:首页 → 问答吧 → Socket用线程通信的问题,求高手指点下,万分感谢

Socket用线程通信的问题,求高手指点下,万分感谢

时间:2011-12-21

来源:互联网

我是个刚涉及C++的新手,现在要用udp编写一个客户端每过10秒向服务端发送消息的程序,要求要用到线程,不用定时器,sokcet通信我ok,但是要在里面加线程,我就懵了,我对线程没什么了解的,求高手指点下,谢谢

socket通信我写好,给大家看下
// client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define Const_Buflength 1024
#define Const_Port 60000

BOOL InitSocket(void);
WSADATA wsaData;
SOCKET m_socket;
SOCKADDR_IN SerAddr;
SOCKADDR_IN CliAddr;

int main()
{
if (!InitSocket())
{
cout<<"The socket initialization failed!"<<endl<<"Exit!"<<endl;
WSACleanup();
system("Pause");
return -1;
}

int iLength = sizeof(SerAddr);
int retval;
char strSendMsg[Const_Buflength];
char strRecvMsg[Const_Buflength];

while (1)
{
//Send
memset(strSendMsg, 0, sizeof(strSendMsg));
cout<<"Please enter the information what you want to send: "<<endl;
cin>>strSendMsg;

if (strcmp(strSendMsg, "exit") == 0)
{
strcpy(strSendMsg, "I'm the client and I'll exit!");
retval = sendto(m_socket, strSendMsg, sizeof(strSendMsg), 0,(SOCKADDR *)
&SerAddr, sizeof(CliAddr));
closesocket(m_socket);
WSACleanup();
return 0;
}

retval = sendto(m_socket, strSendMsg, sizeof(strSendMsg), 0, (SOCKADDR *)
&SerAddr, sizeof(CliAddr));
if (retval == SOCKET_ERROR)
{
cout<<"Send failed!"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
cout<<"There are some errors in this program!"<<endl;
cout<<"The program will exit soon!"<<endl;
break;
}
else if (retval == 0)
{
break;
}
else
{
cout<<"Send success!"<<endl;
}


//Receive
cout<<"Wait for the server to answer!"<<endl;
memset(strRecvMsg, 0, sizeof(strRecvMsg));
retval = recvfrom(m_socket, strRecvMsg, Const_Buflength, 0,(SOCKADDR *)
&SerAddr, &iLength);
if (retval == SOCKET_ERROR)
{
cout<<"Receive failed!"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
cout<<"There are some errors in this program!"<<endl;
cout<<"The program will exit soon !"<<endl;
break;
}
else if (retval == 0)
{
return 0;
}
else
{
cout<<"The server's IP is: \t"<<inet_ntoa(SerAddr.sin_addr)<<endl;
cout<<"The server's port is: \t"<<ntohs(SerAddr.sin_port)<<endl;
cout<<"The news is: \t"<<strRecvMsg<<endl;
}
}

closesocket(m_socket);
WSACleanup();
return 0;
}


BOOL InitSocket(void)
{
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{
cout<<"Loading the socket failed!"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
return FALSE;
}

m_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == m_socket)
{
cout<<"The socket is built failed!"<<" The wrong ID is:"<<WSAGetLastError()<<endl;
return FALSE;
}
SerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.117");
SerAddr.sin_family = AF_INET;
SerAddr.sin_port = htons(Const_Port);
return TRUE;
}


// server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define Const_Buflength 1024
#define Const_Port 60000

BOOL InitSocket(void);
WSADATA wsaData;
SOCKET m_socket;
SOCKADDR_IN SerAddr;
SOCKADDR_IN CliAddr;

int main()
{
if (!InitSocket())
{
cout<<"The socket initialization failed!"<<endl<<"Exit!"<<endl;
WSACleanup();
system("Pause");
return -1;
}

int iLength = sizeof(CliAddr);
int retval;
char strSendMsg[Const_Buflength];
char strRecvMsg[Const_Buflength];

while (1)
{
//Receive
cout<<"Wait for the client to answer!"<<endl;
memset(strRecvMsg, 0, sizeof(strRecvMsg));

retval = recvfrom(m_socket, strRecvMsg, Const_Buflength, 0,(SOCKADDR *)
&CliAddr, &iLength);
if (retval == SOCKET_ERROR)
{
cout<<"Receive failed!"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
break;
}
else if (retval == 0)
{
break;
}
else
{
cout<<"The client's IP is: \t"<<inet_ntoa(CliAddr.sin_addr)<<endl;
cout<<"The client's port is: \t"<<ntohs(CliAddr.sin_port)<<endl;
cout<<"The news is: \t"<<strRecvMsg<<endl;
}


//Send
memset(strSendMsg, 0, sizeof(strSendMsg));
cout<<"Receive the news and forward it!"<<endl;
strcpy(strSendMsg, strRecvMsg);
if (strcmp(strSendMsg, "exit") == 0)
{
strcpy(strSendMsg, "The client exit, me too!");
retval = sendto(m_socket, strSendMsg, sizeof(strSendMsg), 0,(SOCKADDR *)
&CliAddr, sizeof(CliAddr));
closesocket(m_socket);
WSACleanup();
return 0;
}

retval = sendto(m_socket, strSendMsg, sizeof(strSendMsg), 0,(SOCKADDR *)
&CliAddr, sizeof(CliAddr));
if (retval == SOCKET_ERROR)
{
cout<<"Send failed!"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
break;
}
else if (retval == 0)
{
break;
}
else
{
cout<<"Send success!"<<endl;
}
}

closesocket(m_socket);
WSACleanup();
return 0;
}


BOOL InitSocket(void)
{
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{
cout<<"Loading the socket failed!"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
exit(0);
}

m_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == m_socket)
{
cout<<"The socket is built failed!"<<"The wrong ID is: "<<WSAGetLastError()<<endl;
return FALSE;
}
SerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
SerAddr.sin_family = AF_INET;
SerAddr.sin_port = htons(Const_Port);

int retval;
retval = bind(m_socket, (SOCKADDR *)&SerAddr, sizeof(SOCKADDR));
if (SOCKET_ERROR == retval)
{
closesocket(m_socket);
cout<<"Bind the port failed !"<<" The wrong ID is: "<<WSAGetLastError()<<endl;
return FALSE;
}

return TRUE;
}

我该怎么加线程进去呀?

作者: l727628840   发布时间: 2011-12-21

能给个简单的线程通信的例子吗?谢谢

作者: l727628840   发布时间: 2011-12-21

你这个可以不用线程呀,如果一定要用,就把那个发送数据的部分放到一个函数里,然后用CreateThread()生成一个线程,让它去发送;

作者: wesleyluo   发布时间: 2011-12-21

上面那个socket只是我单纯写的通信,我对线程根本就不懂,是把StrSendMsg里的数据放到函数里?是直接赋值给一个函数吗?

作者: l727628840   发布时间: 2011-12-21

_beginthreadex
把socket当做参数传进去

作者: ouyh12345   发布时间: 2011-12-21

哥啊,我都说了我对线程不懂呀,你这说得也太抽象了,能说详细一点吗?

作者: l727628840   发布时间: 2011-12-21

引用 2 楼 wesleyluo 的回复:
你这个可以不用线程呀,如果一定要用,就把那个发送数据的部分放到一个函数里,然后用CreateThread()生成一个线程,让它去发送;



上面那个socket只是我单纯写的通信,我对线程根本就不懂,是把StrSendMsg里的数据放到函数里?是直接赋值给一个函数吗?

作者: l727628840   发布时间: 2011-12-21

引用 4 楼 ouyh12345 的回复:
_beginthreadex
把socket当做参数传进去




哥啊,我都说了我对线程不懂呀,你这说得也太抽象了,能说详细一点吗?

作者: l727628840   发布时间: 2011-12-21