469,921 Members | 2,183 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,921 developers. It's quick & easy.

Doubt in Socket Program

Hi All,

Currently I am working in Socket Progrm written in C.

Here i pasted Both Server and client code..
Server.c code
#include "stdio.h"
#include <winsock.h>
#include <process.h>
#include <windows.h>
#define PORT 1200
#define BACKLOG 4
#include "stdlib.h"
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "advapi32.lib")

int i;

int main()
{
WSADATA wsda;
WSAStartup(0x0101,&wsda);

struct sockaddr_in server;
struct sockaddr_in client;

int sockfd,sockfd2,sockfd3, n_bytes;

char *ret11;
char *a="hello client";
char *b= "Got my Msg";
char *c ="Reply Me ";

const char *msg1;
const char *msg2;
const char *msg3;
char *msg;

msg1 = a;
msg2 = b;
msg3 = c;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("Socket error...");
return 0;
}

server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(PORT);
server.sin_family=AF_INET;
if(bind(sockfd,(struct sockaddr*)&server,sizeof(struct
sockaddr))==-1)
{
printf("Cannot bind...");
return 0;
}

if(listen(sockfd,BACKLOG))
{
printf("Error Listening...");
return 0;
}

int size=sizeof(struct sockaddr_in);
if((sockfd2=accept(sockfd,(struct sockaddr*)&client,&size))==-1)
{
printf("Accept Error...");
return 0;
}

send(sockfd2,msg1,sizeof(msg1),0);

send(sockfd2,msg2,sizeof(msg2),0);

send(sockfd2,msg3,sizeof(msg3),0);


if(listen(sockfd,BACKLOG))
{
printf("Error Listening...");
return 0;
}

int size1=sizeof(struct sockaddr_in);
if((sockfd3=accept(sockfd,(struct sockaddr*)&client,&size1))==-1)
{
printf("Accept Error...");
return 0;
}

if((n_bytes=recv(sockfd3,msg,sizeof(msg),0))==-1)
{

printf("Error Recv in receving value from client(hello)
............");

int err = WSAGetLastError();
if(err == WSAECONNRESET)
printf("\n WSAECONNRESET Error\n");
}
ret11=msg;

if(listen(sockfd,BACKLOG))
{
printf("Error Listening...");
return 0;
}
WSACleanup();
closesocket(sockfd);
closesocket(sockfd2);
closesocket(sockfd3);
return 0;

}


I am sending Three message using multiple sends in same server code.
1.is this possible to use multiple send in same server code?

2.client code

#include "stdio.h"
#include <winsock.h>
#include <sys/types.h>
#include "string.h"
#include "stdlib.h"

#define PORT 1200

#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "advapi32.lib")

int main(int argc,char *argv[])
{
WSADATA wsda;
WSAStartup(0x0101,&wsda);

struct sockaddr_in server;
static int sockfd;
struct hostent *h;
int i=0;
char *a="hello server";
char *b;
char *c;
char *d;

char *msg,*msg1;
char *msg2;
char *msg3;
char **res;
char *ar[3];
int n_bytes;

if(argc!=2)
{
printf("Usage : client ");
exit(1);
}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("Socket Error...");
exit(1);
}

if((h=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Host Name Error...");
exit(1);
}

server.sin_addr=*((struct in_addr*)h->h_addr);
server.sin_port=htons(PORT);
server.sin_family=AF_INET;

if(connect(sockfd,(struct sockaddr*)&server,sizeof(struct
sockaddr))==-1)
{
fprintf(stderr,"Connection out...");
exit(1);
}
if((n_bytes=recv(sockfd,msg1,sizeof(msg1),0))==-1)
{
printf("Error Recv...");
}

printf("the client values is1 %s:\n",msg1);

b=msg1;
if((n_bytes=recv(sockfd,msg2,sizeof(msg2),0))==-1)
{
printf("Error Recv...");
}

printf("the client values is2 %s :\n",msg2);
c=msg2;
if((n_bytes=recv(sockfd,msg3,sizeof(msg3),0))==-1)
{
printf("Error Recv...");
}
printf("the client values is3 %s :\n",msg3);

d=msg3;
ar[0]=b;
ar[1]=c;
ar[2]=d;
res=ar;

msg=a;

if((n_bytes=send(sockfd,msg,sizeof(msg),0))==-1)
{
printf("Error Sending in Client...");
}
closesocket(sockfd);
return 0;
}


Here i am using three recv function for collecting all messege .

My output is

the client values is1 :hell
the client values is2 :Got
the client values is3 :Repl

Here i didnt get the full output what i sent from server side.

Where did i do the mistake?

plz point out my mistake?


Regards,
priya

Nov 14 '05 #1
2 1712
priya wrote:
Currently I am working in Socket Program written in C.
Sockets are outside the scope of this newsgroup.
#include "stdio.h"
#include <winsock.h>
#include <process.h>
#include <windows.h>


It seems you want one of the microsoft.public.* newsgroups.

microsoft.public.win32.programmer.networks perhaps?
Nov 14 '05 #2
priya wrote:
Hi All,

Currently I am working in Socket Progrm written in C.

Here i pasted Both Server and client code..

Networking is not part of Standard C so it is offtopic here.
Server.c code
#include "stdio.h"
#include <winsock.h>
#include <process.h>
#include <windows.h>
#define PORT 1200
#define BACKLOG 4
#include "stdlib.h"
[snip]

You seem to be programming on a Windows platform, maybe one of the
microsoft/ms-windows groups would be more appropriate. See below for
possible insight.

I am sending Three message using multiple sends in same server code.
1.is this possible to use multiple send in same server code?
<OT> Yes, but don't ask here ;) </OT>
2.client code

#include "stdio.h"
#include <winsock.h>
#include <sys/types.h>
#include "string.h"
#include "stdlib.h"

#define PORT 1200

#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "advapi32.lib")

int main(int argc,char *argv[])
{
WSADATA wsda;
WSAStartup(0x0101,&wsda);

struct sockaddr_in server;
static int sockfd;
struct hostent *h;
int i=0;
char *a="hello server";
char *b;
char *c;
char *d;

char *msg,*msg1;
char *msg2;
char *msg3;
char **res;
char *ar[3];
int n_bytes;

if(argc!=2)
{
printf("Usage : client ");
exit(1);
}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("Socket Error...");
exit(1);
}

if((h=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Host Name Error...");
exit(1);
}

server.sin_addr=*((struct in_addr*)h->h_addr);
server.sin_port=htons(PORT);
server.sin_family=AF_INET;

if(connect(sockfd,(struct sockaddr*)&server,sizeof(struct
sockaddr))==-1)
{
fprintf(stderr,"Connection out...");
exit(1);
}
if((n_bytes=recv(sockfd,msg1,sizeof(msg1),0))==-1)

This is most likely where your problem is. I assume that recv has a
signature similiar to:

ssize_t recv(int s, void *buf, size_t len, int flags);

Where s is the socket descriptor, msg1 is the buffer to place the
received data, and len is the length of the buffer. All of this is
off-topic here, BUT, I see two fundamental issues with this statement.
First, you never initialized msg1 so you are invoking undefined
behavior by asking recv to write to where ever it happens to points to.
Second, sizeof(msg1) will return the size of the pointer msg1 (not
sure what you were thinking here), which in your case appears to be 4.
You are only receiving the first 4 bytes of the message which is what
always gets printed. You need to allocate adequate space for your
buffer and provide this length to recv.
{
printf("Error Recv...");
}

printf("the client values is1 %s:\n",msg1);

b=msg1;

if((n_bytes=recv(sockfd,msg2,sizeof(msg2),0))==-1)
{
printf("Error Recv...");
}

printf("the client values is2 %s :\n",msg2);
c=msg2;

if((n_bytes=recv(sockfd,msg3,sizeof(msg3),0))==-1)
{
printf("Error Recv...");
}

printf("the client values is3 %s :\n",msg3);

d=msg3;

ar[0]=b;
ar[1]=c;
ar[2]=d;
res=ar;

msg=a;

if((n_bytes=send(sockfd,msg,sizeof(msg),0))==-1)
{
printf("Error Sending in Client...");
}
closesocket(sockfd);
return 0;
}

Here i am using three recv function for collecting all messege .

My output is

the client values is1 :hell
the client values is2 :Got
the client values is3 :Repl

Here i didnt get the full output what i sent from server side.

Where did i do the mistake?

plz point out my mistake?

Regards,
priya


Please direct any other related questions to a group specific to your
platform.

Rob Gamble

Nov 14 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

11 posts views Thread by anuradha.k.r | last post: by
6 posts views Thread by edu.mvk | last post: by
1 post views Thread by Mr. Beck | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.