您的位置:首页 > 理论基础 > 计算机网络

Socket编程:之TCP案例

2016-08-03 15:56 330 查看
转载请加上博文引用:http://i.cnblogs.com/EditPosts.aspx?postid=5733248&update=1

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int sockfd;

void do_service(int fd)
{
long t = time(0);
char *s = ctime(&t);
write(fd,s,strlen(s));
}
void out_client(struct sockaddr_in clientaddr)
{
char buffer[16];
inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,buffer,sizeof(clientaddr));
unsigned short port = ntohs(clientaddr.sin_port);
printf("client ip:%s (%d)\n",buffer,port);
}

int main(int argc,char *argv[])
{
if(argc < 2)
{
fprintf(stderr,"usage: %s port\n",argv[0]);
exit(1);
}

//创建套接字
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
fprintf(stderr,"socket: %s\n",strerror(errno));
exit(1);
}

//设置IP和端口
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[1]));
addr.sin_addr.s_addr = INADDR_ANY;

//绑定IP和端口
int len = sizeof(addr);
if(bind(sockfd,(struct sockaddr*)&addr,len) < 0)
{
fprintf(stderr,"bind: %s\n",strerror(errno));
exit(1);
}

//开始听
if(listen(sockfd,10) < 0)
{
fprintf(stderr,"listen: %s\n",strerror(errno));
exit(1);
}

while(1)
{
struct sockaddr_in clientaddr;
int c_len = sizeof(clientaddr);
int fd = accept(sockfd,(struct sockaddr*)&clientaddr,&c_len);
if(fd < 0)
{
fprintf(stderr,"accept: %s\n",strerror(errno));
continue;
}
out_client(clientaddr);
do_service(fd);
close(fd);
}
return 0;
}


编译:

  gcc -o server server.c

运行:

  ./server 6666

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int sockfd;

int main(int argc,char *argv[])
{
if(argc < 3)
{
fprintf(stderr,"usage: %s port\n",argv[0]);
exit(1);
}

sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
fprintf(stderr,"socket:%s\n",strerror(errno));
exit(1);
}

struct sockaddr_in sockaddr;
memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&sockaddr.sin_addr.s_addr);
socklen_t len = sizeof(sockaddr);

if(connect(sockfd,(struct sockaddr*)&sockaddr,len) < 0)
{
fprintf(stderr,"connect: %s\n",strerror(errno));
exit(1);
}
char buffer[1024];
memset(buffer,0,sizeof(buffer));
ssize_t n;
if((n = read(sockfd,buffer,1024)) < 0)
{
fprintf(stderr,"read: %s\n",strerror(errno));
exit(1);
}
else
{
printf("%s\n",buffer);
}

return 0;
}


编译:

  gcc -o client client.c

运行:

  ./client 192.168.0.30 6666 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: