古詩詞大全網 - 成語查詢 - Socket編程

Socket編程

最近也在學 還有壹個自己寫的C++聊天程序 有點大 下面是C寫的

sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);基於TCP的socket編程是采用的流式套接字(SOCK_STREAM)。基於UDP采 用的數據報套接字(SOCK_DGRAM).

1.TCP流式套接字的編程步驟

在使用之前須鏈接庫函數:工程->設置->Link->輸入ws2_32.lib,OK!

服務器端程序:

1、加載套接字庫

2、創建套接字(socket)。

3、將套接字綁定到壹個本地地址和端口上(bind)。

4、將套接字設為監聽模式,準備接收客戶請求(listen)。

5、等待客戶請求到來;當請求到來後,接受連接請求,返回壹個新的對應於此次連接的套接字(accept)。

6、用返回的套接字和客戶端進行通信(send/recv)。

7、返回,等待另壹客戶請求。

8、關閉套接字。

客戶端程序:

1、加載套接字庫

2、創建套接字(socket)。

3、向服務器發出連接請求(connect)。

4、和服務器端進行通信(send/recv)。

5、關閉套接字

服務器端代碼如下:

#include <Winsock2.h>//加裁頭文件

#include <stdio.h>//加載標準輸入輸出頭文件

void main()

{

WORD wVersionRequested;//版本號

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}//加載套接字庫,加裁失敗則返回

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

return;

}//如果不是1.1的則退出

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建套接字(socket)。

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉換Unsigned short為網絡字節序的格式

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//將套接字綁定到壹個本地地址和端口上(bind)

listen(sockSrv,5);//將套接字設為監聽模式,準備接收客戶請求(listen)。

SOCKADDR_IN addrClient;//定義地址族

int len=sizeof(SOCKADDR);//初始化這個參數,這個參數必須被初始化

while(1)

{

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//accept的第三個參數壹定要有初始值。

//等待客戶請求到來;當請求到來後,接受連接請求,返回壹個新的對應於此次連接的套接字(accept)。

//此時程序在此發生阻塞

char sendBuf[100];

sprintf(sendBuf,"Welcome %s to _ntoa(addrClient.sin_addr));

//用返回的套接字和客戶端進行通信(send/recv)。

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf[100];

recv(sockConn,recvBuf,100,0);

printf("%s\n",recvBuf);

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);創建套接字(socket)。

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));向服務器發出連接請求(connect)。

char recvBuf[100];和服務器端進行通信(send/recv)。

recv(sockClient,recvBuf,100,0);

printf("%s\n",recvBuf);

send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

closesocket(sockClient);關閉套接字。

WSACleanup();//必須調用這個函數清除參數

}