* 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,這個可是神器,它能訪問的東西很多,例如它的父親,它能和很多東西發生關聯。