嘗試封裝socket 對this指針的猜想

 * mysock.h
 *
 *  創建日期: 2013年7月27日
 *     作者: 車強 ([email protected]).
 */
#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,這個可是神器,它能訪問的東西很多,例如它的父親,它能和很多東西發生關聯。
發佈了40 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章