linux下TCP连接的client和server 【转载】

linux下TCP连接的client和server

http://blog.163.com/caipeipei_love@126/blog/static/2596603220101118433940/

 

基于TCP连接的client和server简单通信

我在看电子书,班主任来了说动手写个client和server的简单通信,只看是不行的,写好了给我看看,真的是一语点中了真理啊:只看不动手,什么时候都不会掌握的!

下午自己就动手写了一个:

主要是基于TCP的三次握手的,面向连接的client和server

tcpserver.c

复制代码
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#define portnumber 8080
int main(int argc ,char *argv[])
{
    int sockfd,new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int sin_size,iDataNum;
//    const char hello[]="Hello cpp, you are success.\n";
    char buffer[4096];
</span><span style="color: #0000ff;">if</span>(argc!=<span style="color: #800080;">2</span><span style="color: #000000;">)
{
     fprintf(stderr,</span><span style="color: #800000;">"</span><span style="color: #800000;">Usage:%s portnumber\a\n</span><span style="color: #800000;">"</span>,argv[<span style="color: #800080;">0</span><span style="color: #000000;">]);
     </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
}

// if((portnumber=atoi(argv[1]))<0)
// {
// fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
// return 0;
// }
if((sockfd=socket(AF_INET,SOCK_STREAM,0))-1)
{
fprintf(stderr,
"Socket error:%s\n\a",strerror(errno));
return 0;
}
bzero(
&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family
=AF_INET;
server_addr.sin_addr.s_addr
=htonl(INADDR_ANY);
server_addr.sin_port
=htons(portnumber);
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))
-1)
{
fprintf(stderr,
"Bind error:%s\n\a",strerror(errno));
return 0;
}
if(listen(sockfd,5)-1)
{
fprintf(stderr,
"Listen error:%s\n\a",strerror(errno));
return 0;
}
while(1)
{
sin_size
=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))
-1)
{
fprintf(stderr,
"Accept error:%s\n\a",strerror(errno));
return 0;
}
fprintf(stdout,
"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
iDataNum
=recv(new_fd,buffer,4096,0);
if(iDataNum<0)
{
perror(
"Recv\n");
exit(
1);
}
printf(
"Recv data is %s\n",buffer);
send(new_fd,buffer,
sizeof(buffer),0);
// if(write(new_fd,hello,strlen(hello))==-1)
// {
// fprintf(stderr,"write error:%s\n",strerror(errno));
// return 0;
// }
close(new_fd);

}
close(sockfd);

// exit(0);
return 0;
}

复制代码

client.c

复制代码
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<errno.h>

int main(int argc,char *argv[])
{
int sockfd;
char sendbuffer[200];
char recvbuffer[200];
// char buffer[1024];
struct sockaddr_in server_addr;
struct hostent host;
int portnumber,nbytes;
if(argc!=3)
{
fprintf(stderr,
"Usage :%s hostname portnumber\a\n",argv[0]);
exit(
1);
}
if((host=gethostbyname(argv[1]))NULL)
{
herror(
"Get host name error\n");
exit(
1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,
"Usage:%s hostname portnumber\a\n",argv[0]);
exit(
1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))
-1)
{
fprintf(stderr,
"Socket Error:%s\a\n",strerror(errno));
exit(
1);
}
bzero(
&server_addr,sizeof(server_addr));
server_addr.sin_family
=AF_INET;
server_addr.sin_port
=htons(portnumber);
server_addr.sin_addr
=
((struct in_addr *)host->h_addr);
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))-1)
{
fprintf(stderr,
"Connect error:%s\n",strerror(errno));
exit(
1);
}
while(1)
{
printf(
"Please input your word:\n");
scanf(
"%s",sendbuffer);
printf(
"\n");
if(strcmp(sendbuffer,"quit")
0)
break;
send(sockfd,sendbuffer,
sizeof(sendbuffer),0);
recv(sockfd,recvbuffer,
200,0);
printf(
"recv data of my world is :%s\n",recvbuffer);
}
// if((nbytes=read(sockfd,buffer,1024))==-1)
//{
// fprintf(stderr,"read error:%s\n",strerror(errno));
// exit(1);
// }
// buffer[nbytes]='\0';
// printf("I have received %s\n",buffer);
close(sockfd);
exit(
0);
}

复制代码

首先要编译tcpserver.c,命令:gcc -g tcpserver.c -o tcpserver

 运行:./tcpserver 8080

 

然后再编译tcpclient.c,具体命令:gcc -g tcpclient.c -o tcpclient

运行:./tcpclient localhost 8080

 

 

 

标签: TCP/UDP
0
0
« 上一篇:S3C6410硬件解码 QT4版(附测试程序下载)
» 下一篇:LTE 接口与承载相关基础知识
	</div>
	<div class="postDesc">posted @ <span id="post-date">2013-09-04 13:58</span> <a href="https://www.cnblogs.com/Adrian99/">星语160523</a> 阅读(<span id="post_view_count">5621</span>) 评论(<span id="post_comment_count">0</span>) &nbsp;<a href="https://i.cnblogs.com/EditArticles.aspx?postid=3300870" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(3300870);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=150612,cb_entryId=3300870,cb_blogApp=currentBlogApp,cb_blogUserGuid='6f0956f1-05e0-e011-8ee0-842b2b196315',cb_entryCreatedDate='2013/9/4 13:58:00';loadViewCount(cb_entryId);var cb_postType=2;var isMarkdown=false;</script>
posted @ 2019-07-07 11:30  xjyxp01  阅读(2677)  评论(0编辑  收藏  举报