[prog] RE: [Courses] [C] network programming

Shuying shuyingw at cse.unsw.EDU.AU
Fri Oct 18 11:13:28 EST 2002


Hi,

Yeah, I did look at that. Any way, I've solved my problem. It's got
nothing to do with the function calls at all. I was just passing my unix
host entdata to itself instead of to its client.

cheers,
Shuying

 On Thu, 17 Oct 2002, Anand R wrote:

> Shuying, I have picked this up directly from Beej's guide to Network
> Programming to quickly help you troubleshoot this.
>
> regards,
> andy
>
> Credits: <Ctrl C> Beej's guide to network Programming <Ctrl v>
>
> Here is the source for listener.c14:
> /*
> ** listener.c - a datagram sockets "server" demo
> */
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <errno.h>
> #include <string.h>
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <arpa/inet.h>
> #define MYPORT 4950 // the port users will be connecting to
> #define MAXBUFLEN 100
> int main(void)
> {
> int sockfd;
> struct sockaddr_in my_addr; // my address information
> struct sockaddr_in their_addr; // connector's address information
> int addr_len, numbytes;
> char buf[MAXBUFLEN];
> if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
> perror("socket");
> exit(1);
> }
> my_addr.sin_family = AF_INET; // host byte order
> my_addr.sin_port = htons(MYPORT); // short, network byte order
> my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
> memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
> if (bind(sockfd, (struct sockaddr *)&my_addr,
> sizeof(struct sockaddr)) == -1) {
> perror("bind");
> exit(1);
> }
> addr_len = sizeof(struct sockaddr);
> if ((numbytes=recvfrom(sockfd,buf, MAXBUFLEN-1, 0,(struct sockaddr
> *)&their_addr, &addr_len)) == -1) {
>
> perror("recvfrom");
> exit(1);
> }
> printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
> printf("packet is %d bytes long\n",numbytes);
> buf[numbytes] = '\0';
> printf("packet contains \"%s\"\n",buf);
> close(sockfd);
> return 0;
> }
>
> Note:
>
> Notice that in our call to socket() we're finally using SOCK_DGRAM. Also,
> note that there's no need to listen()
> or accept(). This is one of the perks of using unconnected datagram sockets!
>
> -----Original Message-----
> From: Shuying [mailto:shuyingw at cse.unsw.EDU.AU]
> Sent: Monday, October 14, 2002 3:10 AM
> To: programming at linuxchix.org
> Cc: courses at linuxchix.org
> Subject: [Courses] [C] network programming
>
>
> Hi,
>
> Sorry about the cross posting, I wasn't sure which list is more
> appropriate so I've sent it to both.
>
> I've got a client and server, which sends UDP packets to each other.
> The client seems to have sent a packet but the server doesn't seem to
> be getting it. Below is a snippet of the relevant code (from the server
> side) in question:
>
> int main(..){
>     int sockfd,s;
>     struct sockaddr_in host, mips;
>     struct hostent *h;
>     ...
>     if((sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
>         perror("socket error");
>         return -1;
>     }
>     if((h = gethostbyname(argv[1])) == 0){
>         herror("unknown host");
>         return -1;
>     }
>     host.sin_family = AF_INET; // host byte order
>     host.sin_port = htons (PORT_NUMBER); // short, network byte order
>     host.sin_addr.s_addr = INADDR_ANY; //auto-fill with this host IP
>     memcpy(&host.sin_addr,h->h_addr, h->h_length);
>     memset(&(host.sin_zero), '\0', 8); // zero out rest of struct
>
>     memset(&(mips.sin_zero), '\0', sizeof(mips));
>     mips.sin_family = AF_INET;
>     mips.sin_port = htons(PORT_NUMBER);
>
>     if((bind(sockfd, (struct sockaddr *) &host, sizeof(host))) < 0) {
>         perror("bind");
>         close(sockfd);
>         return(-1);
>     }
>
> 	while(1){
> 		f((pktlen = recvfrom(sockfd, buf, BUFLEN, 0, (struct
> sockaddr *)&mips, &addrlen))> -1){
>             printf("command is %d\n", ((pkt_t *)(&buf))->hdr);
>             switch(ntohs(((pkt_t *)(&buf))->hdr)){
> 	 	...
> 	    }
> 		sendto(sockfd, (pkt_t *) &pkt, sizeof(pkt), 0, (struct
> sockaddr *)&host, sizeof(host)) ;
>
>
> 	}
>
>
>
> Can anyone tell me what I've done wrong?
>
>
> thanks,
> Shuying
>
> _______________________________________________
> Programming mailing list
> Programming at linuxchix.org
> http://www.linuxchix.org/mailman/listinfo/programming
>






More information about the Programming mailing list