win32下Socket编程(1)
生活随笔
收集整理的這篇文章主要介紹了
win32下Socket编程(1)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
???一.win32的socket編程,是socket編程中比較經(jīng)典也比較基礎(chǔ)的一部分,根據(jù)傳輸方式和協(xié)議的區(qū)別,可以簡單的分為TCP傳遞和UDP傳遞兩種。這篇文章主要是闡述基于TCP的Socket編程。
二.Socket相關(guān)API
1.WSAStartup
int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData );
這個函數(shù)是用來加載Winsocket DLL,wVersionRequested是用來存儲你所要申請的Winsocket DLL版本,可以通過MAKEWORD函數(shù)獲取,wVersionRequested的高位代表副版本號,低位代表高版本號。
附注:
WORD MAKEWORD( BYTE bLow, BYTE bHigh );
2.bind
int bind( SOCKET s, const struct sockaddr FAR* name, int namelen );
將套接字綁定于特定地址的特定端口,其中第二個參數(shù)可以使用SOCKADDR_IN來代替。 附注: struct sockaddr_in{short sin_family; //該參數(shù)在因特網(wǎng)下必須為AF_INETunsigned short sin_port;struct in_addr sin_addr;//IP地址,可以通過inet_addr函數(shù)轉(zhuǎn)換得到,服務(wù)器端也可以直接設(shè)定為INADDR_ANYchar sin_zero[8]; };//需要注意的是這里除了第一個參數(shù)外,其他數(shù)據(jù)均應(yīng)為網(wǎng)絡(luò)格式,應(yīng)該使用htonl或者h(yuǎn)tons進(jìn)行轉(zhuǎn)換 3.listen int listen(__in SOCKET s,__in int backlog ); 這個函數(shù)一般用于服務(wù)器端,這里的第二個參數(shù)為請求隊列的最大程度,注意,不是最大連接數(shù)目 4.accept SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen ); accept一樣主要用于服務(wù)器端,第二個參數(shù)同樣可以使用SOCKADDR_IN來替代,但是注意,這里,該參數(shù)是用來存儲建立連接時候客戶端的相關(guān)信息。 5.connect int connect(SOCKET s,const struct sockaddr FAR* name,int namelen ); 這個函數(shù)用于客戶端,當(dāng)客戶端向服務(wù)器端發(fā)出請求建立連接時候使用,第二個參數(shù)可以使用SOCKADDR_IN來替代,但是注意,這里,該參數(shù)是用來存儲建立連接時候服務(wù)器端的相關(guān)信息。 6.send int send(SOCKET s,const char FAR* buf,int len,int flags ); 該函數(shù)用來相互發(fā)送數(shù)據(jù),但是需要注意的是,服務(wù)器端使用該函數(shù)時候,第一個參數(shù)為accept函數(shù)所返回的socket結(jié)構(gòu)值。 7.recv int recv(__in SOCKET s,__out char* buf,__in int len,__in int flags ); 該函數(shù)與send函數(shù)類似,我就不再贅述。 三.一個簡單示例 服務(wù)器端 #include<WinSock2.h> #include <stdio.h> void main() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) {return;}if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) {WSACleanup();return; }SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));listen(sockSrv,5);SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);while (1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);char sendbuffer[100];sprintf(sendbuffer,"Welcome %s here",inet_ntoa(addrClient.sin_addr));send(sockConn,sendbuffer,strlen(sendbuffer)+1,0);char recvchar[100];recv(sockConn,recvchar,100,0);printf("%s\n",recvchar);closesocket(sockConn);}} 客戶端 #include<WinSock2.h> #include <stdio.h> void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) {return;}if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) {WSACleanup();return; }SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));char recvBuffer[100];recv(sockClient,recvBuffer,100,0);printf("%s\n",recvBuffer);send(sockClient,"This is Kary",strlen("This is Kary")+1,0);closesocket(sockClient);WSACleanup();}轉(zhuǎn)載于:https://www.cnblogs.com/karying/archive/2009/12/14/2015391.html
總結(jié)
以上是生活随笔為你收集整理的win32下Socket编程(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Membership学习记录
- 下一篇: 遭遇价格欺诈