Socket用线程通信的问题,求高手指点下,万分感谢
时间:2011-12-21
来源:互联网
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
作者: wesleyluo 发布时间: 2011-12-21
作者: l727628840 发布时间: 2011-12-21
把socket当做参数传进去
作者: ouyh12345 发布时间: 2011-12-21
作者: l727628840 发布时间: 2011-12-21
你这个可以不用线程呀,如果一定要用,就把那个发送数据的部分放到一个函数里,然后用CreateThread()生成一个线程,让它去发送;
上面那个socket只是我单纯写的通信,我对线程根本就不懂,是把StrSendMsg里的数据放到函数里?是直接赋值给一个函数吗?
作者: l727628840 发布时间: 2011-12-21
_beginthreadex
把socket当做参数传进去
哥啊,我都说了我对线程不懂呀,你这说得也太抽象了,能说详细一点吗?
作者: l727628840 发布时间: 2011-12-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28