基于Linux C的聊天室客户端(四)网络编程

聊天室的最后一篇,这次记录一下网络编程。

Linux 提供socket 来进行网络编程。这次只写客户机,工作流程如下:

1.创建套接口

int socket(int domain,int type,int protocol);

调用成功,返回socket文件描述符,失败则返回-1

第一个参数 int domain 是协议族,TCP/IP协议可以使用 AF_INET 或 PF_INET,在socket.h中可以看到

#define PF_INET     2   /** IP protocol family.  */
#define AF_INET     PF_INET
所以说这两个在使用上是没有区别的,但是语义上的区别还是有,PF 是 Protocol families, 而AF 是Address families ,一个是协议族,一个是地址族,不追求规范的话,混用也行。
第二个参数 int type 是 Socket 的类型,这里选择 SOCK_STREAM ,这个是产生流式套接字。

而 int protocol 是相关协议,建议为零,这样就会自动选择合适的协议。


2.建立与服务器的连接

int connect(int sockfd,struct sockaddr* serv_addr,intaddrlen);

调用成功返回0,失败则返回-1

第一个参数显然就是之前的描述符了,

第二个是 sockaddr 的指针,这个 struct 也在 socket.h 里定义,

/** Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /** Common data: address family and length.  */
    char sa_data[14];       /** Address data.  */
  };
这个就没法直接用,一般做法是用 sockaddr_in 作强制类型转换,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 */
};
这两个 struct 在内存里的存放形式是一样的,所以在 sockaddr_in 里设置相应的值,然后直接转换就可以了。

第三个长度,显然是第二个参数 sockaddr 的长度了,直接用 sizeof 就可以获取。


3.发送,接收数据

int read(int sockfd,char *buf, int len);

int write(int sockfd,char *buf, int len);

这个很像文件操作,因为在Linux 里一切都是文件,socket 也被看做是一种文件,然后在通信被开启后就能进行读写操作了


4.终止连接

int close(int sockfd);

这一块的代码如下(server_connecter.c):

#include "main_head.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

char receiveStr [BUFSIZ];
char * connectServer(char * string, char *ip,int port){
	int clientSockfd;
	socklen_t len;
	struct sockaddr_in sockAddress;
	int ret;
	int n;
	clientSockfd = socket(AF_INET, SOCK_STREAM, 0);
	bzero(&sockAddress, sizeof(sockAddress));
	sockAddress.sin_family=AF_INET;	
	sockAddress.sin_addr.s_addr=inet_addr(ip);
	sockAddress.sin_port = htons(port);

	ret = connect(clientSockfd, (struct sockaddr *)&sockAddress, sizeof(sockAddress));

	if(ret<0){
		printf("connect error\n");
		return "";
	}

	write(clientSockfd, string, strlen(string));
	n = read(clientSockfd, receiveStr, BUFSIZ);
	receiveStr[n]='\0';
	close(clientSockfd);
	return receiveStr;
}

这样就完成了一个简单的聊天室客户端了...大作业真累...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值