[問題] socket setsockopt

看板Linux作者 (硬體)時間10年前 (2015/09/23 15:27), 編輯推噓7(7011)
留言18則, 5人參與, 最新討論串1/1
struct sockaddr_in client_addr; bzero(&client_addr,sizeof(client_addr)); client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = htons(INADDR_ANY); client_addr.sin_port = htons(0); int client_socket = socket(AF_INET,SOCK_STREAM,0); if(client_socket < 0) { printf("Create Socket Failed!\n"); exit(1); } struct ifreq interface; //skfd = socket(AF_INET, SOCK_DGRAM, 0); strncpy(interface.ifr_ifrn.ifrn_name, "eth0", IFNAMSIZ); if (setsockopt(client_socket, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)+1) < 0) { perror("sendpacket: setting SO_BINDTODEVICE"); exit(1); } /* if ( setsockopt(client_socket,SOL_SOCKET,SO_BINDTODEVICE,"wlan0",4) == -1 ) { printf("Set Interface Card Failed!\n"); exit(1); }*/ /* if(bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))) { printf("Client Bind Port Failed!\n"); exit(1); }*/ struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; if(inet_aton(argv[1],&server_addr.sin_addr) == 0) { printf("Server IP Address Error!\n"); exit(1); } server_addr.sin_port = htons(REQUEST_SERVER_PORT); socklen_t server_addr_length = sizeof(server_addr); printf("Here...!\n"); if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0) { printf("Can Not Connect To %s!\n",argv[1]); exit(1); } eth0 Link encap:Ethernet HWaddr 74:d0:2b:07:d1:e8 inet addr:140.117.89.78 Bcast:140.117.89.255 Mask:255.255.255.0 inet6 addr: fe80::76d0:2bff:fe07:d1e8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19560 errors:0 dropped:0 overruns:0 frame:0 TX packets:4755 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3398106 (3.3 MB) TX bytes:574250 (574.2 KB) Interrupt:43 Base address:0x2000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:633 errors:0 dropped:0 overruns:0 frame:0 TX packets:633 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:83692 (83.6 KB) TX bytes:83692 (83.6 KB) wlan0 Link encap:Ethernet HWaddr 6c:71:d9:5f:ea:5b inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::6e71:d9ff:fe5f:ea5b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2046 errors:0 dropped:0 overruns:0 frame:0 TX packets:304 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1276999 (1.2 MB) TX bytes:53934 (53.9 KB) 不知道為什麼我用setsockopt要指定wlan0的網卡傳送, 但是卻不行 在connect時,就會停下來 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.89.78 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1442993273.A.068.html

09/23 17:15, , 1F
setsockopt(...."wlan0",4) <== 明明 "wlan0" 有5個字元...
09/23 17:15, 1F

09/23 17:17, , 2F
XDDDD
09/23 17:17, 2F

09/23 18:12, , 3F
我改成 5 還是一樣
09/23 18:12, 3F

09/23 18:30, , 4F
用 root 身份跑這個程式的話情況如何?
09/23 18:30, 4F

09/23 18:31, , 5F
我記得指定介面的程式,需要有 root 身份權限才可以跑
09/23 18:31, 5F

09/23 18:31, , 6F
一般程式用哪個介面就依據 routing table 來決定
09/23 18:31, 6F

09/23 23:18, , 7F
有用root耶
09/23 23:18, 7F

09/24 15:42, , 8F
所謂 "在connect時,就會停下來" 是說卡在 connect(),
09/24 15:42, 8F

09/24 15:44, , 9F
還是connect()傳回負值,顯示"Can Not Connect To"...後結束?
09/24 15:44, 9F

09/24 18:24, , 10F
卡在connect
09/24 18:24, 10F

09/24 20:10, , 11F
那再多等 3~10分鐘, 通常應該會得到 ETIMEDOUT 而結束 :P
09/24 20:10, 11F

09/24 20:14, , 12F
只是, 問題再於, 你 connect 到哪, 且期望得到什麼結果?
09/24 20:14, 12F

09/24 23:11, , 13F
設成non-block用select等timeout如何?
09/24 23:11, 13F

09/24 23:45, , 14F
connet到server ip address
09/24 23:45, 14F

09/25 14:45, , 15F
你接著要思考的是,wlan0是否有路由到server ip address,
09/25 14:45, 15F

09/25 14:45, , 16F
以及server是否有路由可回到你的wlan0.
09/25 14:45, 16F

09/25 14:55, , 17F
呃,原PO之後的 #1M11fnL5 (Linux) 那一篇似乎是此問題的延續?
09/25 14:55, 17F

09/25 21:34, , 18F
好像是樓上說到的問題,
09/25 21:34, 18F
文章代碼(AID): #1M0bHv1e (Linux)