现在的位置: 首页 > 综合 > 正文

linux之TCP/IP–简单一发送一接收(1)

2012年08月11日 ⁄ 综合 ⁄ 共 2861字 ⁄ 字号 评论关闭

现在是网络社会,学linux不会tcp/ip,心里老感觉空空的。所以也要认真好好学习这个东东了。

实验目的:实现客户端发送,服务器接收

===========server===================

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

#define PORT 3333

int main(int argc, char *argv[])
{
	int sockfd;
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	int sin_size;
	
	char buf[100];

	
	sockfd = socket(AF_INET,SOCK_STREAM,0);	//创建套接字
	if(sockfd == -1)
	{
		fprintf(stderr,"Socket error:%s\n",strerror(errno));
		exit(1);
	}
	
	bzero(&server_addr,sizeof(struct sockaddr_in));	//置字节字符串s的前n个字节为零且包括‘\0’
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);	//任何ip都可连上,我是开放滴
	server_addr.sin_port = htons(PORT);
	int on=1;
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));	//这个作用,你可以去掉再试试

	if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr_in))==-1)	//绑定
	{
		fprintf(stderr,"Bind error:%s\n",strerror(errno));
		exit(1);
	}	
	
	if(listen(sockfd,20)==-1)	//监听,还20个
	{
                fprintf(stderr,"listen error:%s\n",strerror(errno));
                exit(1);
	}
	int new_fd;
	pid_t child;
	int r_size;
	int w_size;
	while(1)
	{
		printf("wait!!!!!\n");
		memset(buf,0,100);
		sin_size = sizeof(struct sockaddr_in);
		if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) //接收,看是否有人连上
		{
	                fprintf(stderr,"Accept error:%s\n",strerror(errno));
        	        exit(1);

		}
		fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
				
	
		if((r_size=read(new_fd,buf,100))==-1) //读取数据
	 	{
			fprintf(stderr,"Read error:%s\n",strerror(errno));
      			exit(1);

	 	}	
		
	 	printf("Received information%d::%s\n",r_size,buf);
			   	
	}
	close(sockfd);
	exit(0);
}
	

===========client====================

#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>

#define PORT 3333

int main(int argc, char *argv[])
{
	int sockfd;
	char buf[100];
	struct sockaddr_in server_addr;
	struct hostent *host;
	
	sockfd = socket(AF_INET,SOCK_STREAM,0);	//创建套接字
	if(sockfd==-1)
	{
		fprintf(stderr,"Socket error:%s\n",strerror(errno));
		exit(1);
	
	}

	bzero(&server_addr,sizeof(server_addr));	//置字节字符串s的前n个字节为零且包括‘\0’	
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(PORT);
	server_addr.sin_addr.s_addr=inet_addr("192.168.1.155");	//ip是要连接的服务器ip
	int con_flag;
	con_flag=connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));	//连接
	if(con_flag==-1)
	{
		fprintf(stderr,"Connect Error:%s\a\n",strerror(errno)); 
		exit(1); 
	}
	printf("Please input some words:");

	fgets(buf,100,stdin);
	
	if(write(sockfd,buf,sizeof(buf))<0)	//往得到的套接字接口里写数据
	{
		fprintf(stderr,"write Error:%s\a\n",strerror(errno));
        	exit(1);

	}
	
	close(sockfd);	//请关闭
        exit(0);
}

实验结果如下:

root@wyz-vlinux:~/test/sc# ./tcp_server
Server get connection from 192.168.1.155
Server received hello mama

Server get connection from 192.168.1.155
Server received i love linux

root@wyz-vlinux:~/test# ./tcp_client
Please input some words:hello mama
root@wyz-vlinux:~/test# ./tcp_client
Please input some words:i love linux
root@wyz-vlinux:~/test#

【上篇】
【下篇】

抱歉!评论已关闭.