作者hardware (硬體)
看板Linux
標題[問題] socket setsockopt
時間Wed Sep 23 15:27:51 2015
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
推 yvb: setsockopt(...."wlan0",4) <== 明明 "wlan0" 有5個字元... 09/23 17:15
推 filiaslayers: XDDDD 09/23 17:17
→ hardware: 我改成 5 還是一樣 09/23 18:12
→ kenduest: 用 root 身份跑這個程式的話情況如何? 09/23 18:30
→ kenduest: 我記得指定介面的程式,需要有 root 身份權限才可以跑 09/23 18:31
→ kenduest: 一般程式用哪個介面就依據 routing table 來決定 09/23 18:31
→ hardware: 有用root耶 09/23 23:18
推 yvb: 所謂 "在connect時,就會停下來" 是說卡在 connect(), 09/24 15:42
→ yvb: 還是connect()傳回負值,顯示"Can Not Connect To"...後結束? 09/24 15:44
→ hardware: 卡在connect 09/24 18:24
推 yvb: 那再多等 3~10分鐘, 通常應該會得到 ETIMEDOUT 而結束 :P 09/24 20:10
→ yvb: 只是, 問題再於, 你 connect 到哪, 且期望得到什麼結果? 09/24 20:14
推 Qbsuran: 設成non-block用select等timeout如何? 09/24 23:11
→ hardware: connet到server ip address 09/24 23:45
推 yvb: 你接著要思考的是,wlan0是否有路由到server ip address, 09/25 14:45
→ yvb: 以及server是否有路由可回到你的wlan0. 09/25 14:45
→ hardware: 好像是樓上說到的問題, 09/25 21:34