www.pudn.com > FindMail.zip > udp.cpp


#include "stdafx.h" 
#include "udp.h" 
#include "util.h" 
 
int udp_wsa_ok =0; 
 
int udp_init() 
{ 
    WSAData wsa; 
 
    //sd_bind =sd_connect =sd_accept =-1; 
    if(WSAStartup(MAKEWORD(1, 1), &wsa) !=0) 
        return -1; 
    udp_wsa_ok =1; 
 
	return 0; 
} 
 
int udp_exit() 
{ 
	if(udp_wsa_ok) WSACleanup(); 
 
	return 0; 
} 
 
 
int udp_connect(char *host, int port) 
{ 
    struct hostent *hp; 
    struct sockaddr_in addr; 
    char temp[200], temp1[200]; 
    unsigned long ul; 
    int sd =-1, ret; 
 
    sd =-1; 
	if((sd =(int)socket(PF_INET, SOCK_DGRAM, 0)) <0) 
	{ 
		sprintf(temp, "socket failed! err:%s", GetErrString(temp1, WSAGetLastError())); 
		return -1; 
	} 
 
	memset(&addr, 0, sizeof(addr)); 
 
    ul =inet_addr(host); 
    if(ul ==0xffffffff) 
    { 
	  if((hp =gethostbyname(host)) ==NULL) 
	  { 
        sprintf(temp, "gethostbyname and inet_addr failed! errno:%d", WSAGetLastError()); 
	    closesocket(sd); 
        return -1; 
      } 
	  memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); 
	} 
    else  addr.sin_addr.s_addr=ul; 
 
	addr.sin_family =AF_INET; 
	addr.sin_port =htons((unsigned short)port); 
    if((ret =connect(sd, (struct sockaddr *)&addr, sizeof(addr))) !=0) 
	{ 
		closesocket(sd); 
		return -1; 
	} 
 
    return sd; 
} 
 
int udp_send(int sd, char *buf, int len) 
{ 
	return send(sd, buf, len, 0); 
} 
 
int udp_recv(int sd, char *buf, int len, int timeout) 
{ 
	return recv(sd, buf, len, 0); 
} 
 
int udp_sendto(int sd, char *host, int port, char *buf, int len) 
{ 
    struct hostent *hp; 
    struct sockaddr_in addr; 
    char temp[200]; 
 
	memset(&addr, 0, sizeof(addr)); 
 
    unsigned long ul =inet_addr(host); 
    if(ul ==0xffffffff) 
    { 
	  if((hp =gethostbyname(host)) ==NULL) 
	  { 
        sprintf(temp, "gethostbyname and inet_addr failed! errno:%d", WSAGetLastError()); 
        return -1; 
      } 
	  memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); 
	} 
    else  addr.sin_addr.s_addr=ul; 
 
	addr.sin_family =AF_INET; 
	addr.sin_port =htons((unsigned short)port); 
 
	return sendto(sd, buf, len, 0, (sockaddr *)&addr, sizeof(sockaddr)); 
} 
 
int udp_recvfrom(int sd, char *host, int port, char *buf, int len, int timeout) 
{ 
    struct hostent *hp; 
    struct sockaddr_in addr; 
    char temp[200]; 
 
	memset(&addr, 0, sizeof(addr)); 
 
    unsigned long ul =inet_addr(host); 
    if(ul ==0xffffffff) 
    { 
	  if((hp =gethostbyname(host)) ==NULL) 
	  { 
        sprintf(temp, "gethostbyname and inet_addr failed! errno:%d", WSAGetLastError()); 
        return -1; 
      } 
	  memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); 
	} 
    else  addr.sin_addr.s_addr=ul; 
 
	addr.sin_family =AF_INET; 
	addr.sin_port =htons((unsigned short)port); 
	int len2 =sizeof(sockaddr); 
	return recvfrom(sd, buf, len, 0, (sockaddr *)&addr, &len2); 
} 
 
int udp_close(int sd) 
{ 
	return closesocket(sd); 
}