前日看到聽風大哥的帖子<初學黑客編程(1)>,寫的是windows下的C/S程序的簡易示例代碼,頓時有了感覺。以前在linux下寫過,但是不知道如何去實際應用,便放在了一邊。昨晚認真的拜讀、改寫了一下。今日記錄下來,作為保留。
代碼如下:
服務端:
/*Service*/
#include <winsock2.h> //初始化網絡編程函數
#include <stdio.h>
#pragma comment(lib,"ws2_32") //靜態函數庫的初始化
#define PORT 139 //這個是用端口掃描器掃描的結果中任選的一個
int main(int argc,char *argv[])
{
system("cls"); //清屏
//定義一個數據類型是DSADATA的wsaData的變量
//wsaData結構被用來保存AfxSocketlnit函數返回的Windows Sockets初始化信息
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
//加載winsock庫,初始化系統環境,以便以后關于網絡的函數調用
if(WSAStartup(sockVersion,&wsaData)!=0)
{
return -1;
}
//創建一個套接字,也就是我們的監聽的端口
SOCKET sListen = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
//判斷創建是否成功,失敗返回INVALID_SOCKET
if(sListen == INVALID_SOCKET)
{
printf("socket error !
");
return -1;
}
//在sockaddr_in結構中裝入地址信息
sockaddr_in sin;
sin.sin_family = PF_INET;
sin.sin_port = htons(PORT); //htons:將主機無符號短整型數轉換成網絡字節順序
sin.sin_addr.S_un.S_addr = INADDR_ANY;
//套接字和本地地址綁定
if(bind(sListen,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("bind error !
");
closesocket(sListen);
return -1;
}
//設置套接字進入監聽模式
if(listen(sListen,1)==SOCKET_ERROR)
{
printf("listen error !
");
closesocket(sListen);
return -1;
}
//接受客戶端的連接請求
sockaddr_in remoteAddr;
SOCKET sClient;
int nAddrlen = sizeof(remoteAddr);
char revData[255];
printf("等待連接…");
//接受一個新連接
sClient = accept(sListen,(SOCKADDR *)&remoteAddr,&nAddrlen);
if(sClient == INVALID_SOCKET)
{
printf("accept error !
");
closesocket(sListen);
return -1;
}
//打印出連接者的ip
printf("
接收到一個連接:%s
",inet_ntoa(remoteAddr.sin_addr));
int flag = 1;
while(flag)
{
//直到連接到有效數據才打印出來
int ret = recv(sClient,revData,sizeof(revData),0);
if(ret > 0)
{
// 為防止打印出錯,把字符串結尾設為0x00
revData[ret] = 0x00;
printf("Client : ");
printf("%s
",revData);
}
if(strcmp(revData,"quit