TCP UDP客戶端伺服器實現通訊

2021-07-27 16:36:21 字數 3632 閱讀 6567

tcp/udp實現程式設計

tcp伺服器與客戶端的連線過程:

客戶端與伺服器三次握手是在accept和connect之後建立的。

三次握手的過程:

a-->b 傳送syn

b->a 確認發乙個ack,再發乙個syn

a->b 確認發乙個ack

四次揮手過程:

a---->b 

發fin

b----->a 

發ack (

注意:此時,

a--->b

的通道被關閉,

a無法再向

b發資料,但是

b--->a

的通道仍然還開著,b到

a的剩下的資料發完之後,

b才會主動發出分手的

fin訊號)

b----->a  

發fin

a----->b  

發ack

為什麼伺服器在分手時需要等待2msl才真正分手?

答:因為ack發給對方,需要乙個msl時間,如果對方在這個時間記憶體收不到ack會重發乙個fin訊號給我,這個訊號也要乙個msl時間。這樣,如果經過兩個msl時間之後,a收不到任何訊號,則可以得出結論:b已經收到了我最後的那個ack了。

tcp伺服器與客戶端連線的**實現:

#include #include #include #include #include #include #include #include #include #include #include #include #include //訊息佇列

#include #include #include //套接字介面

#include //網路位址的轉換

#include void formattime(char buffer)

int main(int argc, char const *argv)

if(listen(sockd,10)<0)

while(1)

char clientip[20];

inet_ntop(af_inet,&clientaddr.sin_addr,clientip,sizeof(clientip));

printf("客戶端%s(%d)已連線.\n",clientip,(ntohs)(clientaddr.sin_port));

char buffer[1024];

formattime(buffer);

write(fd,buffer,strlen(buffer));

close(fd);

} return 0;

}

#include #include #include #include #include #include #include #include #include #include #include #include #include //訊息佇列

#include #include #include //套接字介面

#include //網路位址的轉換

#include //argv[1]是ip位址,argv[2]是埠

int main(int argc, char const *argv)

//建立套接字

int sockfd=socket(af_inet,sock_stream,0);

//繫結網路位址

struct sockaddr_in sockin;

sockin.sin_family=af_inet;

inet_pton(af_inet,argv[1],&sockin.sin_addr);//將十進位制的轉換成二進位制的形式,不需要長度

sockin.sin_port=htons(atoi(argv[2]));

//連線伺服器

int fd;

fd = connect(sockfd,(struct sockaddr*)&sockin,sizeof(sockin));

if(fd<0)

//讀取資訊

char buffer[1024]=;

if(read(sockfd,buffer,sizeof(buffer))<0)

write(1,buffer,strlen(buffer));

close(fd);

return 0;

}

udp伺服器與客戶端的連線過程:

udp伺服器與客戶端通訊**:

#include #include #include #include #include #include #include #include #include #include #include #include #include //訊息佇列

#include #include #include //套接字介面

#include //網路位址的轉換

#include int main(int argc, char const *argv)

//從客戶端讀取資訊

char buffer[1024]=;

struct sockaddr_in clientaddr;

socklen_t len=sizeof(clientaddr);

while(1)

close(sockfd);

return 0;

}

#include #include #include #include #include #include #include #include #include #include #include #include #include //訊息佇列

#include #include #include //套接字介面

#include //網路位址的轉換

#include //argv[1]是伺服器ip位址 argv[2]埠號

int main(int argc, char const *argv)

; gets(buffer);

sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&serveraddr,sizeof(serveraddr));

bzero(buffer,sizeof(buffer));

socklen_t len=sizeof(serveraddr);

recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&serveraddr,&len);

//將讀出的資料寫到螢幕上

printf("返回來的資料是:\n");

write(1,buffer,strlen(buffer));

close(sockfd);

return 0;

}

TCP socket實現客戶端和伺服器端通訊

import socket def main 建立套接字 tcp client socket socket.socket socket.af inet,socket.sock stream 目的資訊 server ip 127.0.0.1 server port 60000 鏈結伺服器 tcp cl...

python socket 實現伺服器 客戶端通訊

伺服器 usr env bin python coding utf 8 import socket server def server sock socket.socket socket.af inet,socket.sock stream sock.bind localhost 8000 sock...

伺服器與客戶端

建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...