尝试封装socket 对this指针的猜想

 * mysock.h
 *
 *  创建日期: 2013年7月27日
 *     作者: 车强 (cheqiang87@qq.com).
 */
#ifndef _MYSOCK_H
#define _MYSOCK_H
#include <sys/types.h>

struct Mysock;
struct Mysock* newsock (int domain, int type, int protocol);
int mybind (const char* ip, const int port, struct Mysock* mysock);
int myconnect (struct Mysock* mysock);
int mylisten(int backlog, struct Mysock* mysock);
int myaccept (struct Mysock* mysock);
ssize_t mysend (int s, const void* buf, size_t len, size_t flags); 
ssize_t myrecv (int s, const void* buf, size_t len, size_t flags);
void freesock(struct Mysock* mysock);

#endif /*_MYSOCK_H*/
 
#include "mysock.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
struct Mysock {

	int (* bind) (const char* ip, const int port, struct Mysock* mysock);		//sys/types.h sys/socket.h
	int (* connect) (struct Mysock* mysock);					//sys/types.h sys/socket.h
	int (* listen) (int backlog, struct Mysock* mysock);				//sys/types.h sys/socket.h
	int (* accept) (struct Mysock* mysock);						//sys/types.h sys/socket.h
	ssize_t (* send) (int s, const void* buf, size_t len, size_t flags);		//sys/types.h sys/socket.h
	ssize_t (* recv) (int s, void* buf, size_t len, size_t flags);			//sys/types.h sys/socket.h
	void* data;

	struct sockaddr_in addr;							//#include <netinet/in.h>
	struct sockaddr_in fromaddr;
 	int sockfd;
	int acceptfd;
};

struct Mysock* newsock (int domain, int type, int protocol) {				
	struct Mysock* mysock;
	mysock = (struct Mysock* )malloc(sizeof(struct Mysock));
	
	if ((mysock->sockfd = socket (domain, type, protocol) ==-1 )) {
		perror ("Func socket faied");
		exit (-1);
	}
	mysock->addr.sin_family = domain;
	mysock->bind = mybind;
	mysock->connect = myconnect;
	mysock->listen = mylisten;
	mysock->accept = myaccept;
	return mysock;
}
int mybind (const char* ip, const int port, struct Mysock* mysock) {			//为了访问数据成员,需要传入该对象的指针
	mysock->addr.sin_port = htons(port);
	mysock->addr.sin_addr.s_addr = inet_addr(ip);
	if (bind (mysock->sockfd, (struct sockaddr*)&(mysock->addr), sizeof(mysock->addr)) == -1) 
		perror ("Bind fail"), exit (-1);
	return 0;	
	
}
int myconnect (struct Mysock* mysock) {							//为了访问数据成员,需要这个指针
	if (connect (mysock->sockfd, (struct sockaddr*)&(mysock->addr), sizeof(mysock->addr)) == -1)
		perror ("Connect fail"), exit (-1);
	return 0;
}
int mylisten(int backlog, struct Mysock* mysock) {					//为了访问数据成员,需要这个指针
	if (listen (mysock->sockfd, backlog) == -1)
		perror ("Listen fail"), exit (-1);
	return 0;
}
int myaccept (struct Mysock* mysock) {							//为了访问数据成员,需要这个指针
	socklen_t len = sizeof(mysock->fromaddr);
	if (mysock->acceptfd = accept(mysock->sockfd,					//区分不同主机acceptfd   
				(struct sockaddr*)&mysock->fromaddr,
				 &len) == -1)
		perror ("Accept fail"), exit (-1);
	return mysock->acceptfd;
}
ssize_t mysend (int s, const void* buf, size_t len, size_t flags) {			//send 和recv 有待进一步完善
	return  send (s, buf, len, flags);	
} 
ssize_t myrecv (int s, const void* buf, size_t len, size_t flags) {
	return  recv (s, buf, len, flags);	
} 
void freesock(struct Mysock* mysock) {
	if (!mysock)
		free(mysock);
}

想尝试着封装一下socket ,使他们看起来更简洁,统一。注释没写,因为这些函数比较常见,定义了一个Mysock类,数据的操作尽量在该类的成员函数中完成。为了访问成员函数中的数据,我只能想出把该指向对象的指针作为参数传递给成员函数的方法了,这有点像c++的this指针,我想c++的设计者是不是在这个过程中发现,干脆约定一个叫this指针的东西吧,这样就不用给每个成员函数都定义一个指向自己的指针了。另外这个类中还定义了一个void* data,这个可是神器,它能访问的东西很多,例如它的父亲,它能和很多东西发生关联。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆腐白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值