Changeset 2099 for Whitix/branches/netchannel/user/sdk/network/udp.c
- Timestamp:
- 06/03/10 22:43:33 (2 years ago)
- Files:
-
- 1 modified
-
Whitix/branches/netchannel/user/sdk/network/udp.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Whitix/branches/netchannel/user/sdk/network/udp.c
r2092 r2099 36 36 } 37 37 38 int UdpSocketBind(Socket* socket, struct SockAddr* address) 39 { 40 struct Ipv4EndPoint chanSrc, chanDest, *addr; 41 42 addr = (struct Ipv4EndPoint*)address; 43 44 chanSrc.address = 0; 45 chanSrc.port = addr->port; 46 47 chanDest.address = IPV4_BROADCAST; 48 chanDest.port = 0; 49 50 socket->channel = ChannelCreate(CHAN_MAKE_TYPE(CHAN_FAMILY_IP, 51 CHAN_TYPE_UDP), &chanSrc, &chanDest, NULL); 52 53 if (!socket->channel) 54 return -1; 55 56 return 0; 57 } 58 38 59 #define CHAN_TYPE_UDP 0x01 39 60 … … 74 95 } 75 96 97 #define UDP_IP_HDR_BYTES (sizeof(struct IpHeader) + sizeof(struct UdpHeader)) 98 76 99 int UdpSocketSendTo(Socket* socket, const void* buffer, unsigned long length, int flags, struct SockAddr* dest) 77 100 { 78 ChanSendBuffer* chanBuff; 79 int ret; 101 const char* p = (const char*)buffer; 80 102 struct Ipv4EndPoint* destIp = (struct Ipv4EndPoint*)dest; 81 103 struct Ipv4EndPoint* srcIp = (struct Ipv4EndPoint*)&socket->channel->src; 82 struct IpHeader* ipHeader; 83 struct UdpHeader* udpHeader; 84 char* data; 85 int totalLength; 86 87 totalLength = length + sizeof(struct UdpHeader) + sizeof(struct IpHeader); 88 104 89 105 if (!dest) 90 106 return -1; 91 107 92 chanBuff = ChanSendBufferAlloc(socket->channel, &data); 93 94 if (!chanBuff) 95 return -1; 96 97 ipHeader=(struct IpHeader*)data; 98 IpBuildHeader(ipHeader, destIp, length + sizeof(struct UdpHeader), PROTOCOL_RAW_UDP); 99 100 /* Add UDP header. */ 101 udpHeader = (struct UdpHeader*)(data + sizeof(struct IpHeader)); 102 103 udpHeader->sourcePort = NetToHostShort(srcIp->port); 104 udpHeader->destPort = NetToHostShort(destIp->port); 105 udpHeader->length = NetToHostShort(length + sizeof(struct UdpHeader)); 106 107 memcpy(data + sizeof(struct IpHeader) + sizeof(struct UdpHeader), buffer, length); 108 109 ret = ChanBufferSend(socket->channel, chanBuff, totalLength); 110 111 return ret; 108 while (length > 0) 109 { 110 ChanSendBuffer* chanBuff; 111 int pktLength = MIN(length, ChanMaxPacketSize(socket->channel) - UDP_IP_HDR_BYTES); 112 int ret; 113 char* data; 114 struct IpHeader* ipHeader; 115 struct UdpHeader* udpHeader; 116 117 chanBuff = ChanSendBufferAlloc(socket->channel, &data); 118 119 if (!chanBuff || !data) 120 goto out; 121 122 ipHeader=(struct IpHeader*)data; 123 udpHeader = (struct UdpHeader*)(data + sizeof(struct IpHeader)); 124 125 IpBuildHeader(ipHeader, destIp, pktLength + sizeof(struct UdpHeader), PROTOCOL_RAW_UDP); 126 127 udpHeader->sourcePort = NetToHostShort(srcIp->port); 128 udpHeader->destPort = NetToHostShort(destIp->port); 129 udpHeader->length = NetToHostShort(pktLength + sizeof(struct UdpHeader)); 130 131 memcpy(data + UDP_IP_HDR_BYTES, p, pktLength); 132 133 ret = ChanBufferSend(socket->channel, chanBuff, pktLength + UDP_IP_HDR_BYTES) - UDP_IP_HDR_BYTES; 134 135 if (ret < pktLength) 136 goto out; 137 138 p += ret; 139 length -= ret; 140 } 141 142 out: 143 return p - (const char*)buffer; 112 144 } 113 145 … … 136 168 struct IpHeader* ipHeader; 137 169 struct UdpHeader* udpHeader; 170 struct Ipv4EndPoint* address = (struct Ipv4EndPoint*)dest; 138 171 139 172 again: 140 read = ChanBufferRecv(socket->channel, &chanBuff, &buf, 2000);173 read = ChanBufferRecv(socket->channel, &chanBuff, &buf, -1); 141 174 142 175 if (read <= 0) 143 { 144 printf("read = %d\n", read); 145 return read; 146 } 176 return -1; 147 177 148 178 /* Verify checksum */ … … 152 182 goto again; 153 183 154 /* TODO: Current buffer. Partial recv */155 156 184 dataByteCnt = read - sizeof(struct UdpHeader) - sizeof(struct IpHeader); 157 185 158 /* FIXME: More checking. */159 186 memcpy(buffer, buf + sizeof(struct IpHeader) + sizeof(struct UdpHeader), 160 187 dataByteCnt); 161 188 162 // ChanBufferFree(socket->channel, chanBuff); 163 164 return dataByteCnt; 189 ChanRecvBuffFree(socket->channel, chanBuff); 190 191 /* Fill in the structure, so we know where the packet came from */ 192 address->address = NetToHostLong(ipHeader->sourceAddr); 193 address->port = NetToHostShort(udpHeader->sourcePort); 194 195 return NetToHostShort(udpHeader->length) - sizeof(struct UdpHeader); 165 196 } 166 197 167 198 static struct SocketOps udpSocketOps = 168 199 { 200 .bind = UdpSocketBind, 169 201 .connect = UdpSocketConnect, 170 202 .connectEx = UdpSocketConnectEx,
