linux网络编程中tcp

相互通信的网络程序通常可以分为客户端和服务器端两部分。简单的C/S服务模式客户端和服务器采用的是一对一的关系。下面以tcp为例讲解网络通信过程,三次握手这些详细过程就省略了。

相关函数,结构:

int socket(int domain, int type, int protocol);
– 函数返回Socket描述符,返回-1表示出错
– domain参数只能取AF_INET, protocol参数一般取0


数据结构:sockaddr_in
struct sockaddr_in {

short int sin_family; /* Address family */

unsigned short int sin_port; /* Port number */

struct in_addr sin_addr; /* Internet address */

unsigned char sin_zero[ 8]; /* Same size as

struct sockaddr */

};

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
bind函数返回-1表示出错,最常见的错误是该端口已经被其他程序绑定。

连接某个Server
int connect(int sockfd, struct sockaddr *servaddr, int addrlen);
servaddr是事先填写好的结构,Server的IP和端口都在该数据结构中指定。

监听服务器端口:

int listen(int sockfd, int queue_length);

响应连接请求:

int accept(int sockfd,struct sockaddr *addr,int *addrlen);

– addr将在函数调用后被填入连接对方的地址信息,如对方的IP、端口等,返回一个新的socket描述符。
accept缺省是阻塞函数,阻塞直到有连接请求。


server.c 实验代码如下:

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

int main(int argc,char **argv)
{	
	char *client;
	int server_sockfd,client_sockfd;
	socklen_t server_len,client_len;
	struct sockaddr_in server_address;
	struct sockaddr_in client_address;
	
	server_sockfd = socket(AF_INET,SOCK_STREAM,0);
	
	bzero(&server_address, sizeof(server_address));
	server_address.sin_family = AF_INET;
	server_address.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取ip地址,client不能用这个宏定义 
	server_address.sin_port = htons(8012);
	server_len=sizeof(server_address);
	
	bind(server_sockfd,(struct sockaddr *)&server_address,server_len);	
	listen(server_sockfd,10);	
	while(1)
	{	
		char msg_client[100];
		char *msg_server = "hello client";
		int n;
		printf("server is waiting... \n");

		client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
		n = read(client_sockfd, msg_client, 100);
		msg_client[n] = '\0';
		printf("receive message form client: %s\n",msg_client);
		write(client_sockfd, msg_server, strlen(msg_server));
		close(client_sockfd);
	}
	return 0;
}


client.c 实验代码如下:

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



int main(int argc,char **argv)
{
	int client_sockfd;
	socklen_t len;
	struct sockaddr_in sock_address;
	int ret;
	char *msg_send = "hello server";
	char msg_rec[100];
	int n;

	client_sockfd=socket(AF_INET,SOCK_STREAM,0);
	bzero(&sock_address, sizeof(sock_address));
	sock_address.sin_family=AF_INET;
	sock_address.sin_addr.s_addr=inet_addr("192.168.80.128");
	sock_address.sin_port=htons(8012);
	
	ret=connect(client_sockfd,(struct sockaddr *)&sock_address,sizeof(sock_address));
	if(ret<0)
	{	
			printf("connect error\n");
			return -1;
	}
	write(client_sockfd,msg_send,strlen(msg_send));
	n = read(client_sockfd,msg_rec,100);
	msg_rec[n] = '\0';
	printf("message form server: %s\n",msg_rec);
	close(client_sockfd);
	return 0;	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值