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