简体   繁体   English

如何在客户端和服务器之间的.c编程中建立sip会话

[英]how to establish sip session in .c programming between client and server

this is client server application I want to establish SIP (session initiation protocol) between client and server. 这是客户端服务器应用程序,我想在客户端和服务器之间建立SIP(会话启动协议)。

So please anyone guide me how can I do this. 因此,请任何人指导我该如何做。


server.c: server.c:


#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>
#include  <sys/wait.h> 
#include  <signal.h>
#include <netinet/tcp.h>

#define MYPORT 3490 // the port users will be connecting to
#define BACKLOG 10    // how many pending connections queue will hold
#define MAXDATASIZE 100

void str_server(int); 

void sigchld_handler(int s)
{
 while(waitpid(-1, NULL, WNOHANG) > 0);
}
int main(void)
{
 int sockfd, numbytes,new_fd, optlen; // listen on sock_fd, new connection on new_fd
 struct sockaddr_in my_addr; // my address information
 struct sockaddr_in their_addr; // connector's address information
 struct tcp_info info;
 socklen_t sin_size;
 struct sigaction sa;
 char buf[MAXDATASIZE];
 int yes=1;
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
     perror("socket");
     exit(1);
 }
 if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
     perror("setsockopt");
     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', sizeof my_addr.sin_zero);
 if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr) == -1) {
     perror("bind");
     exit(1);
 }
 if (listen(sockfd, BACKLOG) == -1) {
     perror("listen");
     exit(1);
 }
 sa.sa_handler = sigchld_handler; // reap all dead processes
 sigemptyset(&sa.sa_mask);
 sa.sa_flags = SA_RESTART;
 if (sigaction(SIGCHLD, &sa, NULL) == -1) {
     perror("sigaction");
     exit(1);
 }
 while(1) { // main accept() loop
     sin_size = sizeof their_addr;
     getchar();
     if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
             &sin_size)) == -1) {
         perror("accept");
         continue;
     }
     printf("server: got connection from %s\n", \
         inet_ntoa(their_addr.sin_addr));

     if (!fork()) { // this is the child process
         close(sockfd); // child doesn't need the listener
         if ((numbytes=recv(new_fd, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);
        }
        buf[numbytes] = '\0';
        printf("Received From Client: %s\n",buf);

 str_server(sockfd);
 FILE *fp = fopen( "adventure.mpg", "rb" );
 //if(!fork())
 // execlp("gedit", "gedit", "SIPFILE.txt", NULL);
            //system("popen /home/umair/Documents/CurrentData/SIPFILE.txt");
     //ShellExecute(GetDesktopWindow(), "open","ls /home/umair/Documents 

            /CurrentData/SIPFILE.txt",NULL, NULL, SW_SHOW);
         if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
             perror("send");
         close(new_fd);
         exit(0);
     }
     close(new_fd); // parent doesn't need this

 }
 return 0;
 }

void str_server(int sock) 
{ 
 char buf[1025]; 
 const char* filename = "test.text"; 
 FILE *file = fopen(filename, "rb"); 
 if (!file)
{
    printf("Can't open file for reading"); 
    return;
}
while (!feof(file)) 
{ 
    int rval = fread(buf, 1, sizeof(buf), file); 
    if (rval < 1)
    {
        printf("Can't read from file");
        fclose(file);
        return;
    }

    int off = 0;
    do
    {
        int sent = send(sock, &buf[off], rval - off, 0);
        if (sent < 1)
        {
            // if the socket is non-blocking, then check
            // the socket error for WSAEWOULDBLOCK/EAGAIN
            // (depending on platform) and if true then
            // use select() to wait for a small period of
            // time to see if the socket becomes writable
            // again before failing the transfer...

            printf("Can't write to socket");
            fclose(file);
            return;
        }

        off += sent;
    }
    while (off < rval);
} 

fclose(file);
}

//client.c : //client.c:


#include  <stdio.h>
#include  <stdlib.h>
#include  <unistd.h>
#include  <errno.h>
#include  <string.h>
#include  <netdb.h>
#include  <sys/types.h>
#include  <netinet/in.h>
#include  <sys/socket.h>
#include <netinet/tcp.h>
#define PORT 3490 // the port client will be connecting to
#define MAXDATASIZE 100 // max number of bytes we can get at once

void RecvFile(int , const char* );
FILE *filename;

int main(int argc, char *argv[])
{
 int sockfd, numbytes, optlen;
 char buf[MAXDATASIZE];
 char *message;
 struct hostent *he;
 struct tcp_info info;
 struct sockaddr_in their_addr; // connector's address information
 if (argc != 2) {
     fprintf(stderr,"usage: client hostname\n");
     exit(1);
 }
if ((he=gethostbyname(argv[1])) == NULL) {   // get the host info
     herror("gethostbyname");

     exit(1);
 }
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
     perror("socket");
     exit(1);
 }
 their_addr.sin_family = AF_INET;    // host byte order
 their_addr.sin_port = htons(PORT); // short, network byte order
 their_addr.sin_addr = *((struct in_addr *)he->h_addr);
 memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
 if (connect(sockfd, (struct sockaddr *)&their_addr,
                                       sizeof their_addr) == -1) {
     perror("connect");
     exit(1);
 }
 printf("connect successfull\n");
/* if (send(sockfd, "Hello, world!\n", 14, 0) == -1)
     perror("send");
 printf("send successfull\n");
*/    
 message = "GET /?st=1 HTTP/1.1\r\nHost: www.msn.com\r\n\r\n";
if( send(sockfd , message , strlen(message) , 0) < 0)
{
    puts("Send failed");
    return 1;
}
puts("Data Send\n");
  RecvFile(sockfd , message);

 optlen = sizeof(info);
 if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
     perror("recv");
     exit(1);
 }
 buf[numbytes] = '\0';
 printf("Received: %s\n",buf);
 close(sockfd);

 return 0;
 }


void RecvFile(int sock, const char* filename) 
{ 
int rval; 
char buf[0x1000]; 
FILE *file = fopen(filename, "wb"); 
if (!file)
{
    printf("Can't open file for writing");
    return;
}

do
{
    rval = recv(sock, buf, sizeof(buf), 0);
    if (rval < 0)
    {
        // if the socket is non-blocking, then check
        // the socket error for WSAEWOULDBLOCK/EAGAIN
        // (depending on platform) and if true then
        // use select() to wait for a small period of
        // time to see if the socket becomes readable
        // again before failing the transfer...

        printf("Can't read from socket");
        fclose(file);
        return;
    }

    if (rval == 0)
        break;

    int off = 0;
    do
    {
        int written = fwrite(&buf[off], 1, rval - off, file);
        if (written < 1)
        {
            printf("Can't write to file");
            fclose(file);
            return;
        }

        off += written;
    }   
    while (off < rval);
} 
while (!feof(file)); 
fclose(file); 
}

Any Suggestion?

I am not sure what you are trying to do with SIP, but the code snippet you've provided shows only establishing a TCP/IP connection. 我不确定您要使用SIP做什么,但是您提供的代码段仅显示建立TCP / IP连接。 If you intend to do a SIP server-client application, I suggest that you look for a library to help you along the way. 如果打算执行SIP服务器-客户端应用程序,建议您寻找一个可以帮助您的库。

One that I know of that is very complete is called Sofia SIP: 我所知道的非常完整的一种叫做Sofia SIP:

http://sofia-sip.sourceforge.net/ http://sofia-sip.sourceforge.net/

It's written by Nokia for Linux in C language. 它是由诺基亚针对Linux用C语言编写的。

Source code is available here: http://gitorious.org/sofia-sip/sofia-sip/trees/master 可在此处获取源代码: http : //gitorious.org/sofia-sip/sofia-sip/trees/master

(Older http://sourceforge.net/p/sofia-sip/git/ci/master/tree/ ) (较旧的http://sourceforge.net/p/sofia-sip/git/ci/master/tree/

您可以通过实用程序及其文档了解有关sipp场景和消息的信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM