Home > Hosting > Server

How to implement linux chat room program

2023-02-06 11:40:15

<p style="text-align: left;">This article mainly introduces the relevant knowledge of how to implement the Linux chat room program. The editor shows you the operation process through actual cases. The operation method is simple, fast, and practical. I hope this article on how to implement the Linux chat room program can help Everyone solves the problem.</p><p style="text-align: left;"><strong>Code1:</strong></p><pre class="brush:bash; hljs cpp" deep="4" style="margin-top: 8px; margin-bottom: 8px; padding: 15px; box-sizing: border-box; overflow-x: auto; background-color: rgb(240, 242, 245); color: rgb(45, 48, 55); font-size: 14px; border: 1px solid rgb(219, 225, 232); border-radius: 4px; white-space: pre-wrap; overflow-wrap: break-word; word-break: break-all; text-align: left;">#ifndef&nbsp;_i_h&nbsp;#define&nbsp;_i_h&nbsp;#include&nbsp;&lt;math.h&gt;#include&nbsp;&lt;stdio.h&gt;#include&nbsp;&lt;sys/socket.h&gt;#include&nbsp;&lt;arpa/inet.h&gt;#include&nbsp;&lt;netinet/in.h&gt;#include&nbsp;&lt;unistd.h&gt;#include&nbsp;&lt;sys/types.h&gt;#include&nbsp;&lt;sys/stat.h&gt;#include&nbsp;&lt;fcntl.h&gt;#include&nbsp;&lt;stdlib.h&gt;#include&nbsp;&lt;errno.h&gt;#include&nbsp;&lt;string.h&gt;#include&nbsp;&lt;inttypes.h&gt;#include&nbsp;&lt;time.h&gt;#include&nbsp;&lt;sys/ioctl.h&gt;&nbsp;#include&nbsp;&lt;net/if.h&gt;#include&nbsp;&lt;signal.h&gt;#include&nbsp;&lt;ncurses.h&gt;#include&nbsp;&lt;math.h&gt;&nbsp;#define&nbsp;sevr_ip&nbsp;&nbsp;&nbsp;&quot;127.0.0.1&quot;#define&nbsp;sevr_port&nbsp;&nbsp;8081#define&nbsp;cntnt_len&nbsp;&nbsp;150#define&nbsp;msg_len&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;msg)#define&nbsp;addr_len&nbsp;&nbsp;sizeof(struct&nbsp;sockaddr)#define&nbsp;usr_len&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;user)#define&nbsp;prt_len&nbsp;&nbsp;&nbsp;8#define&nbsp;hstr_len&nbsp;&nbsp;sizeof(struct&nbsp;chat_history)&nbsp;/*&nbsp;declare&nbsp;global&nbsp;variables&nbsp;*/int&nbsp;mainfd;/*&nbsp;used&nbsp;as&nbsp;chat&nbsp;histroy&nbsp;file&nbsp;handle*/int&nbsp;sockfd;/*&nbsp;used&nbsp;as&nbsp;socket&nbsp;local&nbsp;handle&nbsp;*/int&nbsp;count;struct&nbsp;sockaddr_in&nbsp;server;&nbsp;/*&nbsp;msg&nbsp;is&nbsp;used&nbsp;for&nbsp;communicating&nbsp;message&nbsp;*/struct&nbsp;msg{&nbsp;&nbsp;int&nbsp;flag;&nbsp;/*&nbsp;flag&nbsp;meaning:1,ordinary;&nbsp;2,log&nbsp;msg;&nbsp;3,reg&nbsp;msg,&nbsp;other,file*/&nbsp;&nbsp;int&nbsp;id_from; &nbsp;&nbsp;int&nbsp;id_to; &nbsp;&nbsp;char&nbsp;content[cntnt_len]; &nbsp;&nbsp;char&nbsp;append[10];&nbsp; }; &nbsp;/*&nbsp;user&nbsp;is&nbsp;used&nbsp;information&nbsp;list&nbsp;*/struct&nbsp;user{&nbsp;&nbsp;int&nbsp;id; &nbsp;&nbsp;char&nbsp;name[10]; &nbsp;&nbsp;char&nbsp;password[10]; &nbsp;&nbsp;char&nbsp;*p_chatlog; &nbsp;&nbsp;struct&nbsp;sockaddr&nbsp;user_addr;&nbsp; };/*&nbsp;chat_history&nbsp;used&nbsp;for&nbsp;reading&nbsp;chat&nbsp;history&nbsp;*/struct&nbsp;chat_history{&nbsp;&nbsp;char&nbsp;content[cntnt_len]; &nbsp;&nbsp;char&nbsp;time[25]; &nbsp;&nbsp;int&nbsp;to; &nbsp;&nbsp;int&nbsp;from; &nbsp;&nbsp;int&nbsp;count; }; &nbsp;/*&nbsp;i_functions&nbsp;below&nbsp;is&nbsp;funtions&nbsp;needed&nbsp;by&nbsp;both&nbsp;client&nbsp;and&nbsp;sever&nbsp;*/extern&nbsp;int&nbsp;i_saveto_chat(struct&nbsp;msg&nbsp;*pmsg); &nbsp;int&nbsp;i_clean_stdin&nbsp;(){ &nbsp;&nbsp;while&nbsp;(&#39;n&#39;&nbsp;==&nbsp;getchar()) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;continue; &nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;return(0); } &nbsp;int&nbsp;i_print(char&nbsp;*pmsg,&nbsp;int&nbsp;size){ &nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;1; &nbsp; &nbsp;&nbsp;for&nbsp;(i;&nbsp;i&lt;=&nbsp;size;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(*pmsg&nbsp;!=&nbsp;&#39;n&#39;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,&nbsp;*pmsg); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pmsg&nbsp;++; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;return(0); }int&nbsp;i_input(char&nbsp;*p_input){ &nbsp;&nbsp;char&nbsp;c&nbsp;=&nbsp;&#39;&#39;; &nbsp;&nbsp;int&nbsp;i;&nbsp; &nbsp; &nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;cntnt_len;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;p_input[i]&nbsp;=&nbsp;getchar(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(p_input[i]&nbsp;==&#39;n&#39;) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;printf(&quot;you&nbsp;have&nbsp;input&nbsp;long&nbsp;enough!n&quot;); &nbsp;&nbsp;return(0); }int&nbsp;i_socket(int&nbsp;domain,&nbsp;int&nbsp;type,&nbsp;int&nbsp;protocol){ &nbsp;&nbsp;int&nbsp;fd;&nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;((fd&nbsp;=&nbsp;socket(domain,&nbsp;type,&nbsp;protocol))&nbsp;==&nbsp;-1) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;creat&nbsp;socket&nbsp;error:&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return(fd);&nbsp; } &nbsp;int&nbsp;i_bind(int&nbsp;fd,&nbsp;const&nbsp;struct&nbsp;sockaddr&nbsp;*addr,&nbsp;int&nbsp;namelen){ &nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;bind(fd,&nbsp;addr,&nbsp;namelen)) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;i_bind&nbsp;error:&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;(0); } &nbsp;int&nbsp;i_recvfrom(int&nbsp;fd,&nbsp;void&nbsp;*buf,&nbsp;size_t&nbsp;len,&nbsp;int&nbsp;flags,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr&nbsp;*addr,&nbsp;int&nbsp;*size){&nbsp;&nbsp; &nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;recvfrom(fd,&nbsp;buf,&nbsp;len,&nbsp;flags,&nbsp;addr,&nbsp;size)) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;i_recvfrom&nbsp;error:&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1);&nbsp;&nbsp; &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return(0); } &nbsp;int&nbsp;i_sendto(int&nbsp;fd,&nbsp;void&nbsp;*buf,&nbsp;size_t&nbsp;len,&nbsp;int&nbsp;flags, &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr&nbsp;*addr,&nbsp;int&nbsp;size){ &nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;sendto(fd,&nbsp;buf,&nbsp;len,&nbsp;flags,&nbsp;addr,&nbsp;size)) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;i_sendto&nbsp;error&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1);&nbsp;&nbsp; &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;(0); } &nbsp;int&nbsp;i_open(const&nbsp;char&nbsp;*pathname,&nbsp;int&nbsp;flags){ &nbsp;&nbsp;int&nbsp;fd; &nbsp;&nbsp;if&nbsp;((fd&nbsp;=&nbsp;open(pathname,&nbsp;flags))&nbsp;==&nbsp;-1) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;open_failed&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;(fd); }int&nbsp;i_read(int&nbsp;fd,&nbsp;void&nbsp;*msg,&nbsp;int&nbsp;len){ &nbsp;&nbsp;if(-1&nbsp;==&nbsp;read(fd,&nbsp;msg,&nbsp;len)) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;i_read&nbsp;error&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;} &nbsp;&nbsp;return(0); }int&nbsp;i_write(int&nbsp;fd,&nbsp;void&nbsp;*msg,&nbsp;int&nbsp;len){ &nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;write(fd,&nbsp;msg,&nbsp;len)) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;i_write&nbsp;error&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(0); &nbsp;&nbsp;} &nbsp;&nbsp;return(0); } &nbsp;/*&nbsp;init&nbsp;a&nbsp;socket,file&nbsp;and&nbsp;server&nbsp;addr&nbsp;*/int&nbsp;i_init(){ &nbsp;&nbsp;mainfd&nbsp;=&nbsp;i_open(&quot;./chat_log&quot;,&nbsp;o_rdwr|o_creat); &nbsp;&nbsp;sockfd&nbsp;=&nbsp;i_socket(af_inet,&nbsp;sock_dgram,&nbsp;0); &nbsp; &nbsp;&nbsp;/*&nbsp;initialize&nbsp;server&nbsp;address&nbsp;*/&nbsp;&nbsp;bzero(&amp;server,&nbsp;sizeof(server)); &nbsp;&nbsp;server.sin_family&nbsp;=&nbsp;af_inet; &nbsp;&nbsp;inet_pton(af_inet,&nbsp;&quot;127.0.0.1&quot;,&nbsp;&amp;server.sin_addr); &nbsp;&nbsp;server.sin_port&nbsp;=&nbsp;htons(sevr_port); &nbsp; &nbsp;&nbsp;perror(&quot;init&quot;); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;(0); } &nbsp;char&nbsp;*i_get_time(){ &nbsp;&nbsp;time_t&nbsp;time_now; &nbsp;&nbsp;time(&amp;time_now); &nbsp; &nbsp;&nbsp;return(ctime(&amp;time_now)); }int&nbsp;i_lseek(int&nbsp;fd,&nbsp;off_t&nbsp;size,&nbsp;int&nbsp;position){ &nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;lseek(fd,&nbsp;size,&nbsp;position)) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;seek&nbsp;error&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;} &nbsp;&nbsp;return(0); }int&nbsp;i_saveto_chat(struct&nbsp;msg&nbsp;*pmsg){&nbsp;&nbsp; &nbsp;&nbsp;struct&nbsp;chat_history&nbsp;hstr;&nbsp; &nbsp; &nbsp;&nbsp;bzero(&amp;hstr,&nbsp;hstr_len); &nbsp;&nbsp;count&nbsp;=&nbsp;count&nbsp;+&nbsp;1; &nbsp;&nbsp;hstr.count&nbsp;=count; &nbsp;&nbsp;hstr.from&nbsp;=&nbsp;pmsg-&gt;id_from; &nbsp;&nbsp;hstr.to&nbsp;=&nbsp;pmsg-&gt;id_to; &nbsp;&nbsp;strncpy(hstr.content,&nbsp;pmsg-&gt;content,&nbsp;cntnt_len); &nbsp;&nbsp;strncpy(hstr.time,&nbsp;i_get_time(),&nbsp;25); &nbsp; &nbsp;&nbsp;i_lseek(mainfd,&nbsp;0,&nbsp;seek_end); &nbsp; &nbsp;&nbsp;i_write(mainfd,&nbsp;&amp;hstr,&nbsp;hstr_len); &nbsp; &nbsp;&nbsp;return(0); } &nbsp;int&nbsp;i_print_history(int&nbsp;len,&nbsp;int&nbsp;i){ &nbsp;&nbsp;struct&nbsp;chat_history&nbsp;chat_reader;&nbsp;&nbsp;int&nbsp;j; &nbsp;&nbsp;int&nbsp;position; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;bzero(&amp;chat_reader,&nbsp;hstr_len); &nbsp;&nbsp;if&nbsp;(i&nbsp;!=&nbsp;0) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;=&nbsp;len*i*hstr_len; &nbsp;&nbsp;&nbsp;&nbsp;i_lseek(mainfd,&nbsp;position,&nbsp;seek_end); &nbsp;&nbsp;} &nbsp;&nbsp;else&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;=&nbsp;len*i*hstr_len; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;i_lseek(mainfd,&nbsp;hstr_len,&nbsp;seek_set); &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;len;&nbsp;j++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;i_read(mainfd,&nbsp;&amp;chat_reader,&nbsp;hstr_len); &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;n#item%d:id%dto&nbsp;id%d&nbsp;n&quot;,&nbsp;j, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chat_reader.from,&nbsp;chat_reader.to); &nbsp;&nbsp;&nbsp;&nbsp;i_print(chat_reader.content,&nbsp;cntnt_len); &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;n&nbsp;time:%sn&quot;,&nbsp;chat_reader.time); &nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;return(0); } &nbsp;#endif</pre><p><br/></p><p style="text-align: left;"><strong style="white-space: normal;">Code2:</strong></p><pre class="brush:bash; hljs cpp" style="margin-top: 8px; margin-bottom: 8px; padding: 15px; box-sizing: border-box; overflow-x: auto; background-color: rgb(240, 242, 245); color: rgb(45, 48, 55); font-size: 14px; border: 1px solid rgb(219, 225, 232); border-radius: 4px; white-space: pre-wrap; overflow-wrap: break-word; word-break: break-all; text-align: left;">#include&nbsp;&quot;i.h&quot;&nbsp;#define&nbsp;start_port&nbsp;8089&nbsp;struct&nbsp;sockaddr_in&nbsp;my_addr;int&nbsp;my_id; &nbsp;int&nbsp;my_log();/*&nbsp;declare&nbsp;funtion*/&nbsp;/*&nbsp;*/int&nbsp;i_send_msg(){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int&nbsp;id; &nbsp;&nbsp;struct&nbsp;msg&nbsp;the_msg;&nbsp;&nbsp;char&nbsp;end&nbsp;=&nbsp;&#39;@&#39;; &nbsp; &nbsp;&nbsp;printf(&quot;input&nbsp;recver&nbsp;id:&quot;); &nbsp;&nbsp;scanf(&quot;%d&quot;,&nbsp;&amp;id); &nbsp;&nbsp;getchar(); &nbsp;&nbsp;printf(&quot;ninput&nbsp;content:&quot;); &nbsp;&nbsp;i_input(the_msg.content);&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;char&nbsp;flag&nbsp;=&nbsp;&#39;y&#39;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if&nbsp;(1) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;the_msg.flag&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;the_msg.id_from&nbsp;=&nbsp;my_id; &nbsp;&nbsp;&nbsp;&nbsp;the_msg.id_to&nbsp;=&nbsp;id; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;i_sendto(sockfd,&nbsp;&amp;the_msg,&nbsp;sizeof(struct&nbsp;msg),&nbsp;0, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(struct&nbsp;sockaddr*)&amp;server,&nbsp;sizeof(struct&nbsp;sockaddr)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;i_saveto_chat(&amp;the_msg);&nbsp;/*&nbsp;save&nbsp;to&nbsp;history&nbsp;*/&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;send&nbsp;to&nbsp;id:%d&nbsp;success.n&quot;,&nbsp;my_id); &nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;} &nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;return(1); &nbsp; &nbsp;&nbsp;return(0); } &nbsp;int&nbsp;reply(){ &nbsp;&nbsp;return(0); }int&nbsp;send_file(){ &nbsp;&nbsp;return(0); }/**//*&nbsp;start:initialize&nbsp;*/int&nbsp;init(){&nbsp;&nbsp; &nbsp;&nbsp;struct&nbsp;ifreq&nbsp;req;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;*host;&nbsp;&nbsp;int&nbsp;port; &nbsp; &nbsp;&nbsp;i_init(); &nbsp;&nbsp;/*&nbsp;init&nbsp;user&nbsp;addr&nbsp;*/&nbsp;&nbsp;bzero(&amp;my_addr,&nbsp;sizeof(struct&nbsp;sockaddr)); &nbsp;&nbsp;my_addr.sin_family&nbsp;=&nbsp;af_inet; &nbsp;&nbsp;strcpy(req.ifr_name,&nbsp;&quot;lo&quot;); &nbsp;&nbsp;if&nbsp;(&nbsp;ioctl(sockfd,&nbsp;siocgifaddr,&nbsp;&amp;req)&nbsp;&lt;&nbsp;0&nbsp;)&nbsp;/*&nbsp;get&nbsp;local&nbsp;ip&nbsp;address&nbsp;*/&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;get&nbsp;local&nbsp;ip&nbsp;error&quot;); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp; &nbsp;&nbsp;host&nbsp;=&nbsp;(struct&nbsp;sockaddr_in*)&amp;(req.ifr_addr); &nbsp;&nbsp;printf(&quot;ip:&nbsp;%sn&quot;,&nbsp;inet_ntoa(host-&gt;sin_addr)); &nbsp; &nbsp;&nbsp;memcpy(&amp;my_addr,&nbsp;(struct&nbsp;sockaddr_in*)&amp;(req.ifr_addr), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;sockaddr_in)); &nbsp; &nbsp;&nbsp;port&nbsp;=&nbsp;start_port; &nbsp; &nbsp;&nbsp;do&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;port++; &nbsp;&nbsp;&nbsp;&nbsp;my_addr.sin_port&nbsp;=&nbsp;htons(port); &nbsp;&nbsp;&nbsp;&nbsp;bind(sockfd,&nbsp;(struct&nbsp;sockaddr*)&amp;my_addr, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(struct&nbsp;sockaddr));&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;while&nbsp;(errno&nbsp;==&nbsp;eaddrinuse); &nbsp; &nbsp;&nbsp;struct&nbsp;chat_history&nbsp;apple;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;memset(&amp;apple,&nbsp;&#39;b&#39;,&nbsp;hstr_len); &nbsp;&nbsp;i_lseek(mainfd,&nbsp;0,&nbsp;seek_set); &nbsp;&nbsp;apple.count&nbsp;=&nbsp;0; &nbsp;&nbsp;i_write(mainfd,&nbsp;&amp;apple,&nbsp;hstr_len); &nbsp;&nbsp;i_lseek(mainfd,&nbsp;-hstr_len,&nbsp;seek_end); &nbsp;&nbsp;i_read(mainfd,&nbsp;&amp;apple,&nbsp;hstr_len); &nbsp;&nbsp;count&nbsp;=&nbsp;apple.count; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;printf(&quot;port:%dn&quot;,&nbsp;port);&nbsp; &nbsp;&nbsp;printf(&quot;init&nbsp;successful!!!n&quot;);&nbsp; &nbsp; &nbsp;&nbsp;return(0); &nbsp; }/*&nbsp;end:initialize&nbsp;*//*&nbsp;start:chat_history*/int&nbsp;get_page_size(){ &nbsp;&nbsp;struct&nbsp;chat_history&nbsp;page_size_reader;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;i_lseek(mainfd,&nbsp;-hstr_len,&nbsp;seek_end); &nbsp;&nbsp;i_read(mainfd,&nbsp;&amp;page_size_reader,&nbsp;hstr_len); &nbsp; &nbsp;&nbsp;return(page_size_reader.count); } &nbsp;int&nbsp;read_chat_history(){ &nbsp;&nbsp;printf(&quot;****char*history***&quot;); &nbsp;&nbsp;printf(&quot;(n-nextpage;&nbsp;p-prepage;&nbsp;q-quit)n&quot;); &nbsp; &nbsp;&nbsp;int&nbsp;page_num;/*&nbsp;*/&nbsp;&nbsp;int&nbsp;remains; &nbsp;&nbsp;int&nbsp;berry&nbsp;=&nbsp;get_page_size(); &nbsp; &nbsp; &nbsp;&nbsp;page_num&nbsp;=&nbsp;berry&nbsp;/&nbsp;8; &nbsp;&nbsp;remains&nbsp;=&nbsp;berry&nbsp;%&nbsp;8; &nbsp; &nbsp;&nbsp;if&nbsp;(remains&nbsp;!=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;page_num&nbsp;++; &nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;page_num&nbsp;=&nbsp;page_num; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;printf(&quot;there&nbsp;are&nbsp;%d&nbsp;page&nbsp;total&nbsp;%d&nbsp;items&quot;,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;page_num,&nbsp;berry); &nbsp; &nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;-1; &nbsp; &nbsp;&nbsp;while&nbsp;(1) &nbsp;&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;flag;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((berry&nbsp;+&nbsp;i*8)&nbsp;&gt;=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;(%d~%d)n&quot;,&nbsp;(berry&nbsp;+&nbsp;i*8),&nbsp;(berry&nbsp;+&nbsp;(i+1)*8)); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_print_history(prt_len,&nbsp;i); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;@@@n&quot;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&#39;n&#39;&nbsp;==&nbsp;(flag&nbsp;=&nbsp;getchar())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(flag) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;p&#39;&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i--; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;n&#39;&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;q&#39;&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;&gt;=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;have&nbsp;at&nbsp;the&nbsp;end!n&quot;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;return&nbsp;to&nbsp;menu!n&quot;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;(1~%d)n&quot;,&nbsp;remains);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_print_history(remains,&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;#########over##############n&quot;); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return(0); }/*&nbsp;end:chat_history*//*&nbsp;start:exit_sys*/void&nbsp;exit_sys(){ &nbsp;&nbsp;close(sockfd); &nbsp;&nbsp;close(mainfd); &nbsp;&nbsp;kill(0,&nbsp;sigabrt); &nbsp; &nbsp;&nbsp;exit(0); }/*&nbsp;end:exit_sys*/&nbsp;/*&nbsp;start:menu*/int&nbsp;print_menu(){ &nbsp;&nbsp;printf(&quot;n--------------help--menu----------------n&quot;); &nbsp;&nbsp;printf(&quot;t&nbsp;h--help&nbsp;munun&quot;); &nbsp;&nbsp;printf(&quot;t&nbsp;s--send&nbsp;messagen&quot;); &nbsp;&nbsp;printf(&quot;t&nbsp;r--reply&nbsp;ton&quot;); &nbsp;&nbsp;printf(&quot;t&nbsp;c--chat&nbsp;historyn&quot;); &nbsp;&nbsp;printf(&quot;t&nbsp;f--send&nbsp;filesn&quot;); &nbsp;&nbsp;printf(&quot;t&nbsp;e--exit&nbsp;the&nbsp;systemn&quot;); &nbsp;&nbsp;printf(&quot;----------------help--menu----------------n&quot;); }int&nbsp;get_input(char&nbsp;*command){&nbsp;&nbsp; &nbsp;&nbsp;printf(&quot;&gt;&quot;); &nbsp;&nbsp;scanf(&quot;%c&quot;,&nbsp;command); &nbsp; &nbsp;&nbsp;return(1); }int&nbsp;menu(){ &nbsp;&nbsp;/*&nbsp;to&nbsp;avoid&nbsp;the&nbsp;output&nbsp;at&nbsp;mixed&nbsp;with&nbsp;the&nbsp;sub&nbsp;process&nbsp;*/&nbsp;&nbsp;sleep(1); &nbsp; &nbsp;&nbsp;print_menu(); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;char&nbsp;command; &nbsp; &nbsp;&nbsp;while&nbsp;(1&nbsp;==&nbsp;get_input(&amp;command)) &nbsp;&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;switch(command) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;h&#39;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_menu(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;s&#39;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_send_msg(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;r&#39;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;f&#39;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_file(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;c&#39;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_chat_history(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;e&#39;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit_sys(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&gt;&quot;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;return(0); }/*&nbsp;end:menu*//*&nbsp;start:message&nbsp;contol&nbsp;:send_msg&nbsp;and&nbsp;recv_msg&nbsp;*/int&nbsp;ordnary_msg_recv(struct&nbsp;msg&nbsp;*pmsg){ &nbsp;&nbsp;char&nbsp;time_info[25]; &nbsp;&nbsp;char&nbsp;end_symble; &nbsp;&nbsp;end_symble&nbsp;=&nbsp;&#39;&amp;&#39;; &nbsp; &nbsp;&nbsp;/*&nbsp;handle&nbsp;the&nbsp;msg&nbsp;*/&nbsp;&nbsp;printf(&quot;message:from&nbsp;%s(id%d)&nbsp;to&nbsp;u:n&quot;,&nbsp;pmsg-&gt;append,&nbsp;pmsg-&gt;id_from); &nbsp;&nbsp;i_print(pmsg-&gt;content,&nbsp;msg_len); &nbsp;&nbsp;printf(&quot;nt%s&quot;,&nbsp;i_get_time()); &nbsp; &nbsp;&nbsp;return(0); }int&nbsp;file_msg_recv(struct&nbsp;msg&nbsp;*pmsg){ }int&nbsp;handle_msg(struct&nbsp;msg&nbsp;*pmsg){&nbsp;&nbsp; &nbsp;&nbsp;if&nbsp;(pmsg-&gt;flag&nbsp;==&nbsp;1) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;ordnary_msg_recv(pmsg); &nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;} &nbsp;&nbsp;else&nbsp;if&nbsp;(pmsg-&gt;flag&nbsp;&gt;=&nbsp;4) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;file_msg_recv(pmsg); &nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;return(0); }int&nbsp;listen_msg(){ &nbsp;&nbsp;struct&nbsp;msg&nbsp;msg_recv;&nbsp;&nbsp;struct&nbsp;sockaddr&nbsp;addr_recv;&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;addr_len; &nbsp; &nbsp;&nbsp;printf(&quot;begin&nbsp;listen...n&quot;); &nbsp; &nbsp;&nbsp;for&nbsp;(&nbsp;;&nbsp;;&nbsp;) &nbsp;&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;i_recvfrom(sockfd,&nbsp;&amp;msg_recv,&nbsp;msg_len,&nbsp;0,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;addr_recv,&nbsp;&amp;len); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;i_saveto_chat(&amp;msg_recv);&nbsp;/*&nbsp;save&nbsp;to&nbsp;history&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ordnary_msg_recv(&amp;msg_recv); &nbsp;&nbsp;} } &nbsp;/*&nbsp;end:message&nbsp;contol*/&nbsp;/*&nbsp;start:log&nbsp;process&nbsp;:login&nbsp;and&nbsp;regist&nbsp;*/int&nbsp;login(){ &nbsp;&nbsp;/*&nbsp;input&nbsp;id:*/&nbsp;&nbsp;printf(&quot;*****login&gt;&gt;n&quot;); &nbsp;&nbsp;printf(&quot;id:&quot;); &nbsp;&nbsp;scanf(&quot;%d&quot;,&nbsp;&amp;my_id); &nbsp;&nbsp;/*&nbsp;input&nbsp;password*/&nbsp;&nbsp;char&nbsp;password[15]; &nbsp;&nbsp;printf(&quot;npassword(*less&nbsp;15&nbsp;char):&quot;); &nbsp;&nbsp;scanf(&quot;%s&quot;,&nbsp;password); &nbsp;&nbsp;getchar(); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;/*&nbsp;send&nbsp;login&nbsp;information&nbsp;*/&nbsp;&nbsp;struct&nbsp;msg&nbsp;log_msg;&nbsp; &nbsp;&nbsp;bzero(&amp;log_msg,&nbsp;msg_len); &nbsp;&nbsp;log_msg.flag&nbsp;=&nbsp;2; &nbsp;&nbsp;log_msg.id_from&nbsp;=&nbsp;my_id; &nbsp;&nbsp;log_msg.id_to&nbsp;=&nbsp;0; &nbsp;&nbsp;strncpy(log_msg.content,&nbsp;password,&nbsp;15); &nbsp; &nbsp;&nbsp;i_saveto_chat(&amp;log_msg);&nbsp;/*&nbsp;save&nbsp;to&nbsp;history&nbsp;*/&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;i_sendto(sockfd,&nbsp;(struct&nbsp;msg*)&amp;log_msg,&nbsp;msg_len,&nbsp;0,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;(struct&nbsp;sockaddr*)&amp;server,&nbsp;sizeof(struct&nbsp;sockaddr));//printf(&quot;log_msg&nbsp;:&nbsp;%dn&quot;,&nbsp;log_msg.id_from);//printf(&quot;password:&nbsp;%sn&quot;,&nbsp;log_msg.content);&nbsp;&nbsp;/*&nbsp;after&nbsp;input&nbsp;msg&nbsp;,wait&nbsp;for&nbsp;server&nbsp;respond*/&nbsp;&nbsp;struct&nbsp;sockaddr&nbsp;in_addr;&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;addr_len; &nbsp;&nbsp;i_recvfrom(sockfd,&nbsp;(struct&nbsp;msg*)&amp;log_msg,&nbsp;msg_len,0, &nbsp;&nbsp;&nbsp;&nbsp;&amp;in_addr,&nbsp;&amp;len); &nbsp;&nbsp;if&nbsp;(2&nbsp;==&nbsp;log_msg.flag) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;login&nbsp;successn&quot;); &nbsp;&nbsp;&nbsp;&nbsp;return(0); &nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;else&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;login&nbsp;error:%sn&quot;,&nbsp;log_msg.content); &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;please&nbsp;relog..n&quot;); &nbsp;&nbsp;&nbsp;&nbsp;menu(); &nbsp;&nbsp;} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;(0); }int&nbsp;regist(){ &nbsp;&nbsp;printf(&quot;*****regist&gt;&gt;n&quot;); &nbsp;&nbsp;/*&nbsp;input&nbsp;chat&nbsp;name&nbsp;*/&nbsp;&nbsp;char&nbsp;name[10]; &nbsp; &nbsp;&nbsp;bzero(name,&nbsp;10); &nbsp;&nbsp;printf(&quot;input&nbsp;your&nbsp;chat&nbsp;name(less&nbsp;8&nbsp;char):&quot;); &nbsp;&nbsp;scanf(&quot;%s&quot;,&nbsp;name); &nbsp; &nbsp;&nbsp;//name[9]&nbsp;=&nbsp;&#39;;&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;add&nbsp;a&nbsp;;&nbsp;symbol&nbsp;in&nbsp;the&nbsp;end&nbsp;of&nbsp;name&nbsp;*/&nbsp;&nbsp;/*&nbsp;input&nbsp;password&nbsp;*/&nbsp;&nbsp;char&nbsp;password[15]; &nbsp; &nbsp;&nbsp;bzero(password,&nbsp;15); &nbsp;&nbsp;printf(&quot;ninput&nbsp;your&nbsp;password(less&nbsp;14&nbsp;char):&quot;); &nbsp;&nbsp;scanf(&quot;%s&quot;,&nbsp;password); &nbsp; &nbsp;&nbsp;/*&nbsp;send&nbsp;regist&nbsp;information*/&nbsp;&nbsp;struct&nbsp;msg&nbsp;reg_msg;&nbsp; &nbsp;&nbsp;bzero(&amp;reg_msg,&nbsp;msg_len); &nbsp;&nbsp;reg_msg.flag&nbsp;=&nbsp;3; &nbsp;&nbsp;reg_msg.id_from&nbsp;=&nbsp;0; &nbsp;&nbsp;reg_msg.id_to&nbsp;=&nbsp;0; &nbsp;&nbsp;bzero(reg_msg.content,&nbsp;cntnt_len); &nbsp;&nbsp;strncpy(reg_msg.content,&nbsp;name,&nbsp;10); &nbsp;&nbsp;strncpy(&amp;(reg_msg.content[10]),&nbsp;password,&nbsp;15); &nbsp;&nbsp;reg_msg.content[25]&nbsp;=&nbsp;&#39;n&#39;; &nbsp; &nbsp;&nbsp;i_saveto_chat(&amp;reg_msg);&nbsp;/*&nbsp;save&nbsp;to&nbsp;history&nbsp;*/&nbsp; &nbsp;&nbsp;/*&nbsp;send&nbsp;regist&nbsp;informatin&nbsp;to&nbsp;server&nbsp;*/&nbsp;&nbsp;i_sendto(sockfd,&nbsp;(struct&nbsp;msg*)&amp;reg_msg,&nbsp;sizeof(struct&nbsp;msg),&nbsp;0,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;(struct&nbsp;sockaddr*)&amp;server,&nbsp;addr_len); &nbsp;&nbsp;/*&nbsp;after&nbsp;input&nbsp;msg&nbsp;,wait&nbsp;for&nbsp;server&nbsp;respond*/&nbsp;&nbsp;printf(&quot;wating&nbsp;for&nbsp;server&nbsp;reply...n&quot;); &nbsp; &nbsp;&nbsp;struct&nbsp;sockaddr&nbsp;in_addr;&nbsp;&nbsp;struct&nbsp;msg&nbsp;msg_back;&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;addr_len; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;bzero(&amp;in_addr,&nbsp;addr_len); &nbsp;&nbsp;bzero(&amp;msg_back,&nbsp;msg_len); &nbsp;&nbsp;i_recvfrom(sockfd,(struct&nbsp;msg*)&amp;msg_back,&nbsp;msg_len,0, &nbsp;&nbsp;&nbsp;&nbsp;&amp;in_addr,&nbsp;&amp;len); &nbsp; &nbsp;&nbsp;/*&nbsp;check&nbsp;whether&nbsp;pass&nbsp;*/&nbsp;&nbsp;if&nbsp;(3&nbsp;!=&nbsp;msg_back.flag) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;error:&nbsp;%s&nbsp;n&quot;,&nbsp;msg_back.content); &nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;} &nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;my_id&nbsp;=&nbsp;msg_back.id_to; &nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;congratulate!&nbsp;you&nbsp;have&nbsp;regist&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;id&nbsp;%s(id&nbsp;%d)&nbsp;successn&quot;,&nbsp;msg_back.content,&nbsp;msg_back.id_to); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;login(); &nbsp; &nbsp;&nbsp;return(0);&nbsp; } &nbsp;int&nbsp;my_log(){ &nbsp;&nbsp;/*&nbsp;choose&nbsp;login&nbsp;or&nbsp;regist*/&nbsp;&nbsp;char&nbsp;flag; &nbsp;&nbsp;printf(&quot;are&nbsp;you&nbsp;want&nbsp;login&nbsp;or&nbsp;regist(l/r)n&quot;); &nbsp;&nbsp;scanf(&quot;%c&quot;,&nbsp;&amp;flag); &nbsp;&nbsp;getchar(); &nbsp;&nbsp;switch&nbsp;(flag){ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;l&#39;&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;login(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&#39;r&#39;&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regist(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;error&nbsp;inputn&quot;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_log(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;(0); }/*&nbsp;end:log&nbsp;*/&nbsp;int&nbsp;main(){ &nbsp;&nbsp;init(); &nbsp;&nbsp;printf(&quot;n************welcome!************n&quot;); &nbsp;&nbsp;my_log(); &nbsp; &nbsp;&nbsp;pid_t&nbsp;pid; &nbsp; &nbsp;&nbsp;switch&nbsp;(pid&nbsp;=&nbsp;fork()) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;-1&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;fork&nbsp;error!n&quot;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen_msg(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;} }</pre><p><br/></p>


Copyright Description:No reproduction without permission。

Knowledge sharing community for developers。

Let more developers benefit from it。

Help developers share knowledge through the Internet。

Follow us