Linux 網路程式設計詳解十二

2021-09-07 08:11:18 字數 3277 閱讀 6875

udp的特點

--無連線

--基於訊息的資料傳輸服務

--不可靠

--udp更加高效

udp注意點

--udp報文可能會丟失,重複

--udp報文可能會亂序

--udp缺乏流量控制(udp緩衝區寫滿之後,沒有流量控制,會覆蓋緩衝區)

--udp協議資料報文截斷(如果接收到的資料報文大於緩衝區,報文可以被截斷,後面部分丟失)

--recvfrom返回0,不代表連線關閉(實際上udp是無連線的),sendto可以傳送資料0包,只含有udp頭部

--udp客戶端也可以呼叫connect,但是並沒有完成三次握手,只是維護了乙個狀態資訊(和對等方的)

--一旦呼叫了connect,就可以使用send函式

//

udp協議客戶端

#define setno 0#include

#include

#include

#include

#include

#include

/*see notes

*/#include

#include

in.h>#include

#include /**

* clear_back - 退格不回顯

* 成功返回0,失敗返回-1

* */

intclear_back()

//修改系統設定

term.c_cc[verase] = '\b'

;

//立即生效

if (tcsetattr(stdin_fileno, tcsanow, &term) == -1

)

return0;

}int main(int arg, char *args)

struct

sockaddr_in addr;

addr.sin_family =af_inet;

addr.sin_port = htons(8080

);

//連線的伺服器位址

addr.sin_addr.s_addr = inet_addr("

127.0.0.1");

#if setno==0

/** udp客戶端也可以呼叫connect,但是並沒有完成三次握手,

* 只是維護了乙個狀態資訊(和對等方的),所以傳送報文時,不需要傳伺服器ip

*/if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr))==-1

)

#endif

char buf[1024] = ;

int rc = 0

;

while (fgets(buf, 1024, stdin) !=null)

memset(buf,

0, 1024

); rc = recvfrom(sockfd, buf, 1024, 0

, null, null);

if (rc == -1

)

fputs(buf, stdout);

memset(buf,

0, 1024

); }

return0;

}

//

udp協議伺服器端

#include #include

#include

#include

#include

#include

/*see notes

*/#include

#include

in.h>#include

int main(int arg, char *args)

struct

sockaddr_in addr;

addr.sin_family =af_inet;

addr.sin_port = htons(8080

);

//繫結本地ip位址

addr.sin_addr.s_addr = inet_addr("

127.0.0.1");

if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1

)

int rc = 0

;

char buf[1024] = ;

struct

sockaddr_in peeraddr;

socklen_t peerlen = sizeof

(peeraddr);

while (1

)

while (rc == -1 && errno ==eintr);

if (rc == -1

)

//fputs()函式必須以'\n'結尾才會列印在終端上,,否則需要清空緩衝區

fputs(buf, stdout);

fflush(stdout);

//傳送資料

rc = sendto(sockfd, buf, rc, 0, (struct sockaddr *) &peeraddr,

sizeof

(peeraddr));

if (rc == -1

)

}return0;

}

.suffixes:.c .o

cc=gcc

srcs=hello.c

objs=$(srcs:.c=.o)

exec=ser

srcs1=tec01.c

objs1=$(srcs1:.c=.o)

exec1=clt

start:$(objs) $(objs1)

$(cc) -o $(exec) $(objs)

$(cc) -o $(exec1) $(objs1)

@echo

"^_^-----ok------^_^

".c.o:

$(cc) -wall -g -o $@ -c $

rm -f $(objs)

rm -f $(exec)

Linux 網路程式設計詳解九

tcp ip協議中sigpipe訊號產生原因 1.假設客戶端socket套接字close 會給伺服器傳送位元組段fin 2.伺服器接收到fin,但是沒有呼叫close 因為socket有快取區,所以伺服器仍然可以向客戶端傳送資料。3.如果這種狀態下伺服器向客戶端傳送資料,將會引起tcp ip協議進行...

Linux 網路程式設計詳解十一

read timeout 讀超時檢測函式,不含讀操作 fd 檔案描述符 wait seconds 等待超時秒數,如果為0表示不檢測超時 成功返回0,失敗返回 1,超時返回 1並且errno etimedout int read timeout int fd,unsigned int wait sec...

Linux 網路程式設計常用函式詳解

sendto 經socket傳送資料 相關函式 send sendmsg,recv recvfrom socket 表頭檔案 include sys types.h include sys socket.h 定義函式 int sendto int s const void msg,int len,u...