您的位置:首页 > 理论基础 > 计算机网络

Win_Sockets_Tcp

2015-12-13 21:36 501 查看
a
/*
struct sockaddr_in {
short int sin_family; // 地址族
unsigned short int sin_port; // 端口号
struct in_addr sin_addr; //IP地址
unsigned char sin_zero[8]; //填充0 以保持与struct sockaddr同样大小
};
*/

/*
struct sockaddr {
unsigned short sa_family; ///地址族, AF_xxx
char sa_data[14]; // 14 字节的协议地址
};

*/


Server.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>

using std::cout;
using std::endl;
#define SERVPORT 3333		//----服务器监听端口号
#define BACKLOG 10			//----等待连接队列的最大长度
#pragma comment(lib, "ws2_32.lib")

DWORD WINAPI ClientThread(LPVOID Tmp_CinSocket)
{
SOCKET CinSocket = (SOCKET)Tmp_CinSocket;

/*----发送数据----*/
char* str = "Server: Hello Cliend,You've connected! Please send me something then something!\n";
if (send(CinSocket, str, strlen(str), 0) == SOCKET_ERROR)
perror("Server:send出错!");

/*----循环接收后处理----*/
puts("Local:\tThe words that've received frome Client's:\n");
while (true)
{
char revData[255];
int ret = recv(CinSocket, revData, 255, 0);
if (ret == SOCKET_ERROR)
{
perror("Error with sending data!");
break;
}
else if (ret == 0)
{
cout << "Local:\tClient've ended!\n" << endl;
break;
}
else if (ret > 0)
{
revData[ret] = 0x00;
printf(revData);
}
}
return 0;
}

int main()
{
/*----初始化WSA----*/
WSADATA wsaData;								//----wsaData用来存储系统传回的关于WINSOCK的资料.

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)	//----MAKEWORD(2,2)表示使用WINSOCK2版本.
{												//----MAKEWORD创建一个无符号16位整形,通过连接两个给定的无符号参数
printf("初始化WSA,出错!");
exit(1);
}
//cout << "IP包最大长度是: " << wsaData.iMaxSockets << std::endl;

/*----创建服务器Socket----*/
SOCKET ListenSocket;
if ((ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("socket创建出错!");
exit(1);
}

/*----绑定IP和端口----*/
struct sockaddr_in my_addr;					//----本机地址信息
my_addr.sin_family = AF_INET;				//----TCP协议族
my_addr.sin_port = htons(SERVPORT);			//----端口号
my_addr.sin_addr.s_addr = INADDR_ANY;		//----IP地址.设置.
memset(my_addr.sin_zero, NULL, 8);			//----string.h中的字符cp置空函数

if (bind(ListenSocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)	//----也可以!=0即失败
{
perror("bind出错!");
exit(1);
}

/*----设置监听,最大连接数----*/
if (listen(ListenSocket, BACKLOG) == SOCKET_ERROR)												//----也可以!=0或==-1表示失败
{
perror("listen出错!");
exit(1);
}
cout << "服务端开始监听!" << std::endl;

/*----循环处理连接----*/
struct sockaddr_in CinAdress;				//----接收到的地址
int CinAdressLength = sizeof(CinAdress);	//----存储接收到的地址长度(Bytes)
SOCKET CinSocket;							//----接收到的socket
while (true)
{	/*----轮询方式,接受完一个开线程处理,并继续调用accept函数等待(若无等到阻塞主线程,到新连接触发继续)----*/
CinSocket = accept(ListenSocket, (struct sockaddr *)&CinAdress, &CinAdressLength);		//----接受到的,CinAdressLength <= sizeof(struct sockaddr_in),
if (CinSocket == INVALID_SOCKET)
{
perror("accept出错");
continue;
}
printf("Local:\treceived a connection from \n\t%s:%d\n", inet_ntoa(CinAdress.sin_addr), CinAdress.sin_port);

HANDLE hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CinSocket, 0, NULL);
if (hThread == NULL)
{
cout << "Create Thread Failed!" << endl;
break;
}
CloseHandle(hThread);
}
closesocket(ListenSocket);
closesocket(CinSocket);
WSACleanup();

return 0;
}


Client.cpp

#include <WINSOCK2.H>
#include <STDIO.H>
#include<string.h>
#include<iostream>
using namespace std;
#pragma  comment(lib,"ws2_32.lib")
#define Server_Port 3333
#define Server_Address "123.124.2.103"

int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
if(WSAStartup(sockVersion, &data) != 0)
{
printf("WSA Start Error!");
}

SOCKET ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ClientSocket == INVALID_SOCKET)
{
printf("invalid ClientSocket !");
return -1;
}

sockaddr_in ServerAddress;
ServerAddress.sin_family = AF_INET;
ServerAddress.sin_port = htons(Server_Port);
ServerAddress.sin_addr.S_un.S_addr = inet_addr(Server_Address);
if (connect(ClientSocket, (sockaddr *)&ServerAddress, sizeof(ServerAddress)) == SOCKET_ERROR)
{
printf("connect Server error !");
closesocket(ClientSocket);
return -1;
}

char recData[255];
int ret = recv(ClientSocket, recData, 255, 0);
if(ret > 0)
{
//recData[ret] = 0x00;
printf(recData);
}
char sendData[255] = "Client:\tHello,Server!\n";
cout<<"Local:\tPlease cin something by someting,with ending of begin next line with # \n";
while(sendData[0]!='#')
{
sendData[strlen(sendData)]=NULL;
send(ClientSocket, sendData, strlen(sendData), 0);
cin.getline(sendData,255);
}

closesocket(ClientSocket);
WSACleanup();

return 0;
}




a

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: