Linux下实现客户端和服务器端的通信
<p>首先,可以将代码复制下来放到U盘里,然后挂载到Linux上</p><p>挂载步骤</p>
<p>找到设备->USB->你U盘的名字</p>
<p><img src="https://img2018.cnblogs.com/blog/1490994/201906/1490994-20190620102156865-214395316.png"></p>
<p> </p>
<p>挂载成功</p>
<p><img src="https://img2018.cnblogs.com/blog/1490994/201906/1490994-20190620102251437-13453596.png"></p>
<p>访问U盘把代码拷贝到home文件夹下,就可以直接进行编译。</p>
<p>client.c </p>
<div class="cnblogs_code">
<pre> #include <stdio.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><unistd.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><strings.h><span style="color: rgba(0, 0, 0, 1)">
#include</span><<span style="color: rgba(0, 0, 255, 1)">string</span>.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><sys/types.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><sys/socket.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><stdlib.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><netinet/<span style="color: rgba(0, 0, 255, 1)">in</span>.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><netdb.h>
<span style="color: rgba(0, 0, 255, 1)">#define</span> PORT 1234
<span style="color: rgba(0, 0, 255, 1)">#define</span> MAXDATASIZE 100
<span style="color: rgba(0, 0, 255, 1)">char</span> receiveM[<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">char</span> sendM[<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">argv[])
{
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> fd, numbytes;
</span><span style="color: rgba(0, 0, 255, 1)">struct</span> hostent *<span style="color: rgba(0, 0, 0, 1)">he;
</span><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in server;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查用户输入,如果用户输入不正确,提示用户正确的输入方法</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (argc !=<span style="color: rgba(128, 0, 128, 1)">2</span>) { printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Usage: %s <IP Address>\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>,argv[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过函数 gethostbyname()获得字符串形式的ip地址,并赋给he</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((he=gethostbyname(argv[<span style="color: rgba(128, 0, 128, 1)">1</span>]))==<span style="color: rgba(0, 0, 0, 1)">NULL){
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gethostbyname() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 产生套接字fd</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((fd=socket(AF_INET, SOCK_STREAM, <span style="color: rgba(128, 0, 128, 1)">0</span>))==-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">socket() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
bzero(</span>&server,<span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(server));
server.sin_family </span>=<span style="color: rgba(0, 0, 0, 1)"> AF_INET;
server.sin_port </span>=<span style="color: rgba(0, 0, 0, 1)"> htons(PORT);
server.sin_addr </span>= *((<span style="color: rgba(0, 0, 255, 1)">struct</span> in_addr *)he-><span style="color: rgba(0, 0, 0, 1)">h_addr);
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(connect(fd, (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *)&server,<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr))==-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">connect() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向服务器发送数据</span>
<span style="color: rgba(0, 0, 0, 1)">
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">send message to server:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
fgets(sendM,</span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">,stdin);
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> send_le;
send_le</span>=<span style="color: rgba(0, 0, 0, 1)">strlen(sendM);
sendM=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
send(fd,sendM,strlen(sendM),</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 从服务器接收数据</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((numbytes=recv(fd,receiveM,MAXDATASIZE,<span style="color: rgba(128, 0, 128, 1)">0</span>)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">recv() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">receive message from server:%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,receiveM);
close(fd);
}</span></pre>
</div>
<p>server.c</p>
<div class="cnblogs_code">
<pre> #include <stdio.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><<span style="color: rgba(0, 0, 255, 1)">string</span>.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><strings.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><stdlib.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><unistd.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><sys/types.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><sys/socket.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><netinet/<span style="color: rgba(0, 0, 255, 1)">in</span>.h><span style="color: rgba(0, 0, 0, 1)">
#include </span><arpa/inet.h><span style="color: rgba(0, 0, 0, 1)">
#include</span><pthread.h>
<span style="color: rgba(0, 0, 255, 1)">#define</span> PORT 1234
<span style="color: rgba(0, 0, 255, 1)">#define</span> BACKLOG 1
<span style="color: rgba(0, 0, 255, 1)">void</span> *start_routine( <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">ptr)
{
</span><span style="color: rgba(0, 0, 255, 1)">int</span> fd = *(<span style="color: rgba(0, 0, 255, 1)">int</span> *<span style="color: rgba(0, 0, 0, 1)">)ptr;
</span><span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> numbytes;
</span><span style="color: rgba(0, 0, 255, 1)">int</span> i,c=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">this is a new thread,you got connected\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fd=%d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,fd);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((numbytes=recv(fd,buf,<span style="color: rgba(128, 0, 128, 1)">100</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">recv() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> str;
</span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> buffer;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将收到的字符串反转</span>
<span style="color: rgba(0, 0, 255, 1)">for</span>(c=<span style="color: rgba(128, 0, 128, 1)">0</span>;c<(numbytes-<span style="color: rgba(128, 0, 128, 1)">1</span>);c++<span style="color: rgba(0, 0, 0, 1)">)
{
buffer</span>=<span style="color: rgba(0, 0, 0, 1)">buf;
}
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">receive message:%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,buf);
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">numbytes=%d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,numbytes);
</span><span style="color: rgba(0, 0, 255, 1)">for</span>(i=<span style="color: rgba(128, 0, 128, 1)">0</span>;i<numbytes;i++<span style="color: rgba(0, 0, 0, 1)">)
{
str</span>=buf;
}
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">server will send:%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,str);
numbytes</span>=send(fd,str,<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(str),<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">send numbytes=%d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,numbytes);
close(fd);
}
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">main()
{
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> listenfd, connectfd;
</span><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in server;
</span><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in client;
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> sin_size;
sin_size</span>=<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in);
pthread_t thread; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个线程号</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((listenfd = socket(AF_INET, SOCK_STREAM, <span style="color: rgba(128, 0, 128, 1)">0</span>)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
{
perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Creating socket failed.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">int</span> opt =<span style="color: rgba(0, 0, 0, 1)"> SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, </span>&opt, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(opt));
bzero(</span>&server,<span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(server));
server.sin_family</span>=<span style="color: rgba(0, 0, 0, 1)">AF_INET;
server.sin_port</span>=<span style="color: rgba(0, 0, 0, 1)">htons(PORT);
server.sin_addr.s_addr </span>=<span style="color: rgba(0, 0, 0, 1)"> htonl (INADDR_ANY);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 绑定</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (bind(listenfd, (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *)&server, <span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Bind error.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 监听 </span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(listen(listenfd,BACKLOG) == -<span style="color: rgba(128, 0, 128, 1)">1</span>){<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> calls listen() </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">listen() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">while</span>(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> accept </span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((connectfd = accept(listenfd,(<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *)&client,&sin_size))==-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">accept() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
}
printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">You got a connection from %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,inet_ntoa(client.sin_addr) );
pthread_create(</span>&thread,NULL,start_routine,(<span style="color: rgba(0, 0, 255, 1)">void</span> *)&<span style="color: rgba(0, 0, 0, 1)">connectfd);
}
close(listenfd);
}</span></pre>
</div>
<p>代码从U盘复制到home后,编译执行</p>
<p>打开三个中端</p>
<p><img src="https://img2018.cnblogs.com/blog/1490994/201906/1490994-20190620103033826-1227731278.png"></p>
<p> </p>
<p>可以发现用户端和服务器端连接成功,即用户端发送的信息,服务器端可以接收的到。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/weixinyu98/p/11057217.html
頁:
[1]