OOB套接字傳輸例項 達不到預期結果

2021-06-01 13:44:26 字數 2973 閱讀 9852

**本來是全照書上抄的,後來發現編譯不成功,所以就稍微改了下。下面是我修改後的**:

server.c

// oob套接字傳輸服務端(server.c)

#include #include #include #include #include #include #include #include #include #define myport 4000

#define backlog 10

int new_fd;

void sig_urg(int signo)

int main(int argc, char *argv)

my_addr.sin_family = af_inet;

my_addr.sin_port = htons(myport);

my_addr.sin_addr.s_addr = inaddr_any; // 自動設定為自己的ip

bzero(&(my_addr.sin_zero), 8); // 將結構的其餘空間清零

if(bind(sock_fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1)

if(listen(sock_fd, backlog) == -1)

void *old_sig_urg_handle; // 儲存系統預設的訊號處理函式

if((old_sig_urg_handle = signal(sigurg, sig_urg)) == sig_err)

fcntl(sock_fd, f_setown, getpid());

while(1)

printf("server: got connection from [%s]\n", inet_ntoa(their_addr.sin_addr));

if(!fork())

buf[n] = 0;

printf("recv: %d bytes: %s\n", n, buf);

close(new_fd);

}exit(0);

} }while(waitpid(-1, null, wnohang) > 0);

signal(sigurg, old_sig_urg_handle); // 恢復系統預設的訊號處理函式

return 0;

}

client.c

// oob套接字傳輸客戶端(client.c)

#include #include #include #include #include #include #include #include #define myport 4000

#define maxdatasize 100

int main(int argc, char *argv)

if((he = gethostbyname(argv[1])) == null)

if((sock_fd = socket(af_inet, sock_stream, 0)) == -1)

their_addr.sin_family = af_inet;

their_addr.sin_port = htons(myport);

their_addr.sin_addr = *((struct in_addr*)he->h_addr);

bzero(&(their_addr.sin_zero), 8);

if(connect(sock_fd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr)) == -1)

if(send(sock_fd, "123", 3, 0) == -1)

printf("send 3 bytes of normal data\n");

sleep(1);

if(send(sock_fd, "4", 1, msg_oob) == -1)

printf("send 1 byte of oob data\n");

sleep(1);

if(send(sock_fd, "56", 2, 0) == -1)

printf("send 2 bytes of normal data\n");

sleep(1);

if(send(sock_fd, "7", 1, msg_oob) == -1)

printf("send 1 byte of oob data\n");

sleep(1);

if(send(sock_fd, "89", 2, msg_oob) == -1)

printf("send 2 bytes of oob data\n");

sleep(1);

close(sock_fd);

return 0;

}

執行結果:

1. server端:

[zcm@socket #39]$./myserver 

server: got connection from [127.0.0.1]

recv: 3 bytes: 123

recv eof

2. 客戶端:

[zcm@socket #25]$./myclient localhost

send 3 bytes of normal data

send 1 byte of oob data

send 2 bytes of normal data

send 1 byte of oob data

send 2 bytes of oob data

[zcm@socket #26]$

現在的疑問是:我感覺signal函式雖然呼叫成功了,但是沒起到作用。我認為正常情況下,sig_urg()應該會被呼叫,但結果是好像他沒有收到sigurg訊號,所以沒有呼叫sig_urg這個函式。

若有高人能解決,小弟萬分感激!

傳輸模型與套接字

1.概念 tcp ip模型 tcp ip協議不是tcp和ip兩個協議的合稱,而是指網際網路整個tcp ip協議族 2.模型對比 osi七層模型 tcp ip 應用層 應用層 表示層 會話層傳輸層 終端裝置 傳輸層 網路層 路由器 網路層 資料鏈路層 交換機 網路介面層 物理層 網絡卡,網線等1.概念...

傳輸模型和套接字

基本模型 osi七層模型 先有模型,再有協議 tcp建立連線 三次握手 怎麼連線的?為什麼要三次?客戶端 我要連線你 服務端 好的,我準備好了 客戶端 我建立連線了 三次保證同步,例如因為網路延遲導致兩邊收到訊息延後,發出的報文就可能收不到或者不知道是誰的。資料傳輸 斷開連線 四次揮手 客戶端 我要...

套接字(二) Socket 套接字程式設計(附例項)

tcp ip位址家族統一的套接字位址結構定義如下 struct sockaddr in sin family 指定使用該套接字位址的位址家族。這裡必須設定為af inet,表示程式所使用的位址家族是tcp ip sin zero 8 主要是為了與第乙個版本的套接字位址結構大小相同而設定,實際使用時,...