伺服器端程式設計的步驟
1:載入套接字型檔,建立套接字(wsastartup()/socket());
2:繫結套接字到乙個ip位址和乙個埠上(bind());
3:將套接字設定為監聽模式等待連線請求(listen());
4:請求到來後,接受連線請求,返回乙個新的對應於此次連線的套接字(accept());
5:用返回的套接字和客戶端進行通訊(send()/recv());
6:返回,等待另一連線請求;
7:關閉套接字,關閉載入的套接字型檔(closesocket()/wsacleanup())。
客戶端程式設計的步驟
1:載入套接字型檔,建立套接字(wsastartup()/socket());
2:向伺服器發出連線請求(connect());
3:和伺服器端進行通訊(send()/recv());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/wsacleanup())
socket開發所必須需要的檔案(以winsock v2.0為例):
標頭檔案:winsock2.h
庫檔案:ws2_32.lib
動態庫:w32_32.dll
第一步: 載入/釋放winsock庫
1.載入
wsadata wsa;
/*初始化socket資源*/
if (wsastartup(makeword(1,1),&wsa) != 0)
2.釋放方法
wsacleanup();
第二步: 構造socket
1.服務端:構造監聽socket,流式socket.
socket listen_sock = socket(af_inet, sock_stream, 0);
2.客戶端:構造通訊socket,流式socket.
socket client_sock = socket(af_inet, sock_stream, 0);
第三步:配置監聽位址和埠
1.服務端
sockaddr_in serveraddr;
zeromemory((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = af_inet;
serveraddr.sin_port = htons(1234); /*本地監聽埠:1234*/
serveraddr.sin_addr.s_addr = htonl(inaddr_any); /*有ip*/
sockaddr_in結構
struct sockaddr_in ;sin _family為網路位址型別,必須設定為af_inet。
sin_port為服務埠,注意不要使用已固定的服務埠,如http的埠80等。如果埠設定為0,則系統會自動分配乙個唯一埠。sin_addr為乙個unsigned long的ip位址。sin_zero為填充字段,純粹用來保證結構的大小。如果將sin_addr設定為inaddr_any,則表示所有的ip位址,也即所有的計算機。
例如:unsigned long addr=inet_addr("192.1.8.84")
第四步:繫結socket
1.服務端:繫結監聽socket.
bind(listen_sock,(struct sockaddr *)&serveraddr,sizeof(serveraddr))
第五步: 服務端/客戶端連線
1.服務端:等待客戶端接入.
socket command_sock = accept(listen_sock, ...);
2.客戶端:請求與服務端連線.
int ret = connect(client_sock, ...);
第六步: 收/發資料
1.服務端:等待客戶端接入.
char buf[1024];
接收資料:recv(command_sock,buf, ...);
傳送資料:send(command_sock,buf, ...);
2.客戶端:請求與服務端連線.
傳送資料:
send(client_sock,buf, ...);
接收資料:recv(client_sock,buf, ...);
第七步: 關閉socket
1.服務端:關閉socket.
closesocket(listen_sock);
closesocket(command_sock);
2.客戶端:關閉socket.
closesocket(client_sock);
完整**如下:
#include #include void main()
if( lobyte( wsadata.wversion ) != 1 ||
hibyte( wsadata.wversion ) != 1 )
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;
intlen=sizeof(sockaddr);
while(1)
}
#include #include void main()
if ( lobyte( wsadata.wversion ) != 1 ||
hibyte( wsadata.wversion ) != 1 )
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));
send(sockclient,"hello",strlen("hello")+1,0);
char recvbuf[50];
recv(sockclient,recvbuf,50,0);
printf("%s\n",recvbuf);
closesocket(sockclient);
wsacleanup();
}
socket 套接字通訊
要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...
利用Socket套接字通訊
我只寫了服務端程式。服務端會了,客服端就好寫了。我的伺服器功能是個小計算器。server.c socket 實現通訊。客服端輸入表示式經過伺服器計算出結果發給客服端 伺服器端建立任務 監聽客戶端,收到資料,發給服務端的子程序讓子程式,子程式呼叫execlp bc命令計算出結果給父程序,父程序傳給伺服...
java通訊 套接字Socket
無論用什麼語言開發,socket都是繞不過去的乙個環節,若以簡單論,除了檔案操作,程序間通過socket通訊還是比較方便的。對於主機a和b,若a主機想向b主機傳送資訊,那麼基本步驟如下 1.首先確保b主機上socket服務端開啟,服務端會監聽本機上的乙個埠,例如8080。socket服務端會以阻塞形...