1、 reuseaddr
(1) 為了解決time_wait狀態下不能馬上重啟程式的問題,所以伺服器要設定reuseadda屬性。使用setsockopt進行設定
(2) setsockopt原型:
int setsockopt(int sockfd, int level, int optname,void optval, socklen_t optlen);
引數不介紹就這樣設定:
int on = 1;
if(setsockopt(sockfd,sol_socket,so_reuseaddr,(void)&on,sizeof(on)) != 0)
2、 處理多客戶端連線
(1) 在之前的**中當乙個客戶端去連線伺服器之後其他客戶端就沒有辦法連線伺服器進行通訊了。對這樣的情況需要伺服器端使用多程序進行解決,當有乙個程序過來就開乙個程序與客戶端進行溝通。
(2) 實際**:
#include
#include / see notes */
#include
#include
#include
#include
#define handle_error(msg) \
do while (0)
void do_echo(int clientfd)
; while(1)
if(iread_ret == -1)
write(clientfd,rbuf,strlen(rbuf));
printf("%s\n",rbuf);}}
int main()
/*int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
*//*
struct sockaddr_in
*/memset(&addr,0,sizeof(addr));
addr.sin_family = af_inet;
addr.sin_port = htons(5883);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int on = 1;
if(setsockopt(sockfd,sol_socket,so_reuseaddr,(void*)&on,sizeof(on)) != 0)\
if(bind(sockfd, (const struct sockaddr*)&addr,sizeof(addr)) == -1)
/*int listen(int sockfd, int backlog);
*/if(listen(sockfd,somaxconn) == -1)
/*int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);*/
memset(&clientaddr,0,sizeof(&clientaddr));
acceptlen = sizeof(clientaddr);
while(1)
//如果accept這位老哥返回東西了則開啟程序
pid_t tpid = fork();
if(tpid == 0)
close(clientfd);//父程序只需要監聽,不要讀東西
}close(sockfd);
close(clientfd);
return 0;
}
3、 點對點聊天程式的實現
(1) 實現乙個客戶端和乙個伺服器看,開乙個程序,子程序進行讀(或者寫),父程序進行寫(或者讀)。客戶端和伺服器都這麼幹
(2) 需要注意的是當客戶端或者伺服器端關掉之後,要注意殭屍程序的出現。使用訊號解決,當乙個程序關閉之後提醒另外乙個程序也關閉。
(3)服務端**:
#include
#include /* see notes */
#include
#include
#include
#include
#include
#define handle_error(msg) \
do while (0)
void handler(int sig)
int main()
/*int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
*//*
struct sockaddr_in
*/memset(&addr,0,sizeof(addr));
addr.sin_family = af_inet;
addr.sin_port = htons(5883);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int on = 1;
if(setsockopt(sockfd,sol_socket,so_reuseaddr,(void*)&on,sizeof(on)) != 0)\
if(bind(sockfd, (const struct sockaddr*)&addr,sizeof(addr)) == -1)
/*int listen(int sockfd, int backlog);
*/if(listen(sockfd,somaxconn) == -1)
/*int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);*/
memset(&clientaddr,0,sizeof(&clientaddr));
acceptlen = sizeof(clientaddr);
if((clientfd = accept(sockfd,(struct sockaddr*)&clientaddr,&acceptlen)) == -1)
pid_t tpid = fork();
if(tpid == 0) //子程序發資料
; while(fgets(wbuf,sizeof(wbuf),stdin) != null )
kill(tpid,sigusr1);
exit(exit_success);
}else //父程序讀資料
; while(1)
else if(readret == -1)
printf("%s",rbuf);
}exit(exit_success);
} return 0;
}
(4)客戶端**:
#include
#include /* see notes */
#include
#include
#include
#include
#include
#define handle_error(msg) \
do while (0)
void handler(int sig)
int main()
; char rbuf[128] = ;
if((sockfd = socket(af_inet, sock_stream,0)) == -1)
/*int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
*//*
struct sockaddr_in
*/memset(&addr,0,sizeof(&addr));
addr.sin_family = af_inet;
addr.sin_port = htons(5883);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(sockfd, (const struct sockaddr*)&addr,sizeof(addr)) == -1)
pid_t tpid = fork();
if(tpid == 0)
; int readret = -1;
while(1)
else if(readret == -1)
printf("%s",rbuf);
memset(rbuf,0,sizeof(rbuf));
}printf("close\n");
close(sockfd);
kill(tpid,sigusr1);
exit(exit_success);
} else
; while(fgets(wbuf,sizeof(wbuf),stdin) != 0)
close(sockfd);
exit(exit_success);
} return 0;
}
聊天小專案之多客戶端聊天
需求分析 能支援對個使用者同時聊天,實現群聊功能 方法分析 採用多執行緒處理方式。不同的客戶端開啟不同的工作執行緒,共享同一程序的記憶體資訊。服務端 某一客戶端傳送的資訊給其他客戶端,實現資訊實時共享。服務端 server.c include include include include incl...
socket程式設計 TCP IP 多客戶端
支援多客戶的client server程式 前面的client server程式只能實現server和乙個客戶的對話。在實際應用中,往往是在伺服器上執行乙個永久的程式,它可以接收來自其他多個客戶端的請求,提供相應的服務。為了實現在伺服器方給多個客戶提供服務的功能,需要對上 面的程式進行改造,利用多執...
python網路程式設計TCP服務多客戶端的服務端開發
服務多客戶端tcp服務端開發 2 方法說明 3 4 bind host,port 表示繫結埠號,host是ip位址,ip位址一般不進 行繫結,表示本機的任何乙個ip位址都行,port是埠號 5 listen backlog 表示設定監聽,backlog引數表示最大等待連線的 個數 6 accept ...