// CSocketSev.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <winsock.h>
#include <iostream>
#pragma comment(lib,"Ws2_32.lib")
#define DEFULT_PORT 2000
SOCKET m_Listening;
int Receive(SOCKET fd , char* szText , int len)
{
int cnt, rc;
cnt = len;
while(cnt > 0)
{
rc = recv(fd,szText,cnt,0);
if(rc == SOCKET_ERROR)
{
return -1;
}
if(rc == 0)
{
return len-cnt;
}
szText += rc;
cnt -= rc;
}
return len;
}
int Send(SOCKET fd , char* szText , int len)
{
int cnt , rc;
cnt = len;
while(cnt > 0)
{
rc = send(fd,szText,cnt,0);
if(rc == SOCKET_ERROR)
{
return -1;
}
if(rc == 0)
{
return len-cnt;
}
szText += rc;
cnt -= rc;
}
return len;
}
DWORD WINAPI ListenThread(LPVOID Ipparam)
{
SOCKET Listening = m_Listening;
//開始監聽
if(listen(Listening,40) == SOCKET_ERROR)
{
return -1;
}
char szBuf[MAX_PATH];
memset(szBuf,0,MAX_PATH);
while(1)
{
SOCKET ConnectSocket;
SOCKADDR_IN ClientAddr;
int nLen = sizeof(sockaddr);
//阻塞 線程 直到 有客戶端連接 節省資源
ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);
char* pAddrname = inet_ntoa(ClientAddr.sin_addr); //將網絡地址 轉換成 “.” 點隔字符串
Receive(ConnectSocket,szBuf,100);
//界面顯示請求數據
strcat(szBuf,"來自(");
strcat(szBuf,pAddrname);
strcat(szBuf,")");
Send(ConnectSocket,szBuf,100);
puts(szBuf);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(WSAStartup(0x0110,&wsaData)) //調用 windowSocketDll
{
puts("Winsock無法初始化");
return -1;
}
DWORD dwThreadID = 0;
sockaddr_in local;
local.sin_family = AF_INET;
//設置端口 DEFAULT_PORT
if(argc > 0)
{
local.sin_port = htons((u_short)argv[0]); //htons 將主機的無符號短整形數 轉換成網絡字節順序
}
else
{
local.sin_port = htons(DEFULT_PORT);
}
//ip 設置成 INADDR_ANY 系統自動查找
local.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//INADDR_ANY;
//初始化Socket
m_Listening = socket(AF_INET,SOCK_STREAM,0);
if(m_Listening == INVALID_SOCKET)
{
puts("創建Winsock實例失敗!");
return -1;
}
if(bind(m_Listening,(sockaddr*)&local.sin_addr,sizeof(local) == SOCKET_ERROR))
{
closesocket(m_Listening);
puts("綁定端口失敗");
return -1;
}
if(m_Listening == SOCKET_ERROR)
{
puts("監聽端口失敗");
return -1;
}
puts("啓動成功");
char szBuf[MAX_PATH];
//初始化
memset(szBuf,0,MAX_PATH);
while(1)
{
SOCKET ConnectSocket;
sockaddr_in ClientAddr;
int nLen = sizeof(sockaddr);
//阻塞
ConnectSocket = accept(m_Listening,(sockaddr*)&ClientAddr,&nLen);
//得到客戶端IP
char* pAddrname = inet_ntoa(ClientAddr.sin_addr);
Receive(ConnectSocket,szBuf,100);
//像客戶端 發送回覆
Send(ConnectSocket,szBuf,100);
//界面顯示數據
strcat(szBuf,"來自(");
strcat(szBuf,pAddrname);
strcat(szBuf,")");
puts(szBuf);
}
//return 0;
}