socket程式設計(1)簡單的TCP UDP程式設計

2021-05-24 07:57:18 字數 3202 閱讀 9641

socket程式設計是一種與底層網路協議無關的程式設計方式,socket意味一種插口,即乙個位址配上乙個埠就構成了一端插口,既然他與底層協議無關,所以我們在使用socket 程式設計的時候,就可以任意選用哪種網路協議,如最流行的tcp/ip協議。

在所有socket程式設計前腰包含標頭檔案

下面是基於連線的tcp程式設計方法:

伺服器端:伺服器端是指在tcp中進行監聽,也就是被動連線的那一端,伺服器端在於客戶端建立好連線後,可以同伺服器端傳送和接收資訊,他用乙個監聽socket進行監聽客戶端連線,然後得到連線後可以建立乙個通訊socket進行通訊,可以同時與多個客戶端通訊,伺服器端的程式設計主要有以下幾步:

1.初始winsocket

wsastartup(makeword(2,2),&wsad);

3.設定監聽socket的位址埠,並繫結給這個socket

listenaddr.sin_family=af_inet;

listenaddr.sin_addr.s_addr=inet_addr("127.0.0.1");

listenaddr.sin_port=htons(11111);

if(bind(listensocket,(sockaddr *)(&listenaddr),sizeof(listenaddr))==socket_error)

4.進行監聽  

if(listen(listensocket,1)==socket_error)

5.迴圈等待新連線進入的socket,如果等到則建立乙個socket與之通訊,accept操作是乙個阻塞的操作。

while(!stopped)

//這裡可以得到接入的socket的位址埠

char* add=inet_ntoa(clientaddr.sin_addr);

int port=ntohs(clientaddr.sin_port);

//   acceptsocket就是乙個已經於客戶端連線上的可以進行通訊的socket,這裡 要 啟用乙個 新執行緒用acceptsocket閾值通訊

6、在啟用的新執行緒中一般是這樣的:

呼叫recv或send函式接收和傳送資訊

ret=recv(acceptsocket,buf,1000,0);

7關閉伺服器

首先關閉監聽的socket

closesocket(listensocket);

然後清理winsocket

wsacleanup();

客戶端:客戶端socket是進行主動連線的那一方,客戶端的程式設計通常是這樣的:

1.初始winsocket

wsastartup(makeword(2,2),&wsad);

2.建立乙個用於連線的socket

3.設定監聽socket的位址埠,並繫結給這個socket

caddres.sin_family=af_inet;

caddres.sin_addr.s_addr=inet_addr("127.0.0.1");

caddres.sin_port=htons(11111);

4、想某個伺服器傳送連線

if(wsaconnect(csocket,(sockaddr*)(&caddres),sizeof(caddres),0,0,0,0)==socket_error)

5呼叫recv或send函式接收和傳送資訊

6通訊結束後關閉

closesocket();

wsacleanup();

send和recv的一些方法:

send()函式不保證會把send的內容全部send出去,這樣就可能要多次send(),常用的方法是

int totalbyte=data.size();

dword ret;

wsabuf sendbuf;

sendbuf.len=totalbyte;

sendbuf.buf=data;

while(totalbyte>0)

totalbyte-=ret;

sendbuf.len=totalbyte;

sendbuf.buf+=ret;

}下面是基於無連線的udp程式設計方法

這使用的是無連線的協議,tcp是有連線的,即要求在連線之前需要伺服器端和客戶端都繫結埠,然後連線後可以雙向傳送接收。

但是無連線的協議只需要伺服器端繫結埠,而客戶端不需要,客戶端只需要向伺服器端的監聽埠傳送訊息就可以了,也只能由客戶端向伺服器端傳送訊息。程式的實現如下;

伺服器端

1.初始化

wsastartup(makeword(2,2),&wsad);

2.建立用於監聽的socket

s=socket(af_inet,sock_dgram,0);

3.繫結乙個位址埠

sockaddr_in udpadress,sender;

int senferaddsize=sizeof(sender);

udpadress.sin_family=af_inet;

udpadress.sin_port=htons(11112);

udpadress.sin_addr.s_addr=inet_addr("127.0.0.1");

bind(s,(sockaddr*)&udpadress,sizeof(udpadress));

4.就可以呼叫recvfrom這個無連線的的接收函式接收資料,這個函式是阻塞的。無連線的協議不保證資料傳輸的可靠性,而且一次傳輸的資料量是有限的

ret=recvfrom(s,data,1000,0,(sockaddr*)&sender,&senferaddsize);

5.結束後關閉socket和清理

客戶端

1.初始化

wsastartup(makeword(2,2),&wsad);

2.建立乙個socket,但是不用繫結埠

usocket=socket(af_inet,sock_dgram,0);

3.使用無連線的傳送函式sendto向指定位址傳送資料

sendto(usocket,data(),totalbyte,0,(sockaddr*)&dstadd,dstaddrsize);

4.關閉、清理

closesocket(usocket);

wsacleanup();

Socket 程式設計(TCP)

詳細請參見 點我o o哈!很不錯的一篇文章哈 下面是接收資料和傳送資料的函式 int receive socket fd,char sztext,int len if rc 0 return len cnt sztext rc cnt rc return len int send socket fd...

Socket 程式設計(TCP)

下面是接收資料和傳送資料的函式 cpp view plain copy intreceive socket fd,char sztext,intlen if rc 0 return len cnt sztext rc cnt rc return len int send socket fd,char...

socket程式設計TCP

注意一定要先啟動server,再啟動client,否則client因為無法找到server而丟擲異常 coding utf 8 from socket import serverport 12000 af inet表示底層網路使用的是ipv4,sock stream表示使用的socket型別是tcp...