linux 系统之间,网络编程,消息发送与接收

chunli@ubuntu:~/udp$ sudo apt-get update
chunli@ubuntu:~/udp$ sudo apt-get install build-essential
chunli@ubuntu:~/udp$ sudo apt-get install make
chunli@ubuntu:~/udp$ ll
-rw-rw-r-- 1 chunli chunli  279 May 15 10:36 makefile
-rw-rw-r-- 1 chunli chunli 2.3K May 15 10:36 myudp.cpp
-rw-rw-r-- 1 chunli chunli  250 May 15 10:37 myudp.h
-rw-rw-r-- 1 chunli chunli  259 May 15 10:37 stdafx.cpp
用这4个文件,编译出一个库文件,源代码在文下面:
chunli@ubuntu:~/udp$ make
g++ -Wall -fPIC -D__UNIX -o myudp.o -c myudp.cpp
g++ -o libmyudp.so myudp.o -shared
^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^

写一个主程序

vim main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "myudp.h"
int main(int argc, char args[])
{
        if (argc < 2)
        {
                bind_socket(8080);
                char buf[1024] = { 0 };
                char IP[100] = { 0 };
                memset(buf, 0, sizeof(buf));
                recv_socket(buf, sizeof(buf), IP);
                printf("from %s : %s \n",IP,buf);
        } else
        {
                char buf[1024] = { "hello world!" };
                send_socket("127.0.0.1", 8080, buf, strlen(buf));
        }
        return 0;
}
编译
chunli@ubuntu:~/udp$ gcc main.c -L. -lmyudp
向本机发送
chunli@ubuntu:~/udp$ ./a.out 127.0.0.1
等待接收
chunli@ubuntu:~/udp$ ./a.out
from 127.0.0.1 : hello world!












源代码:

chunli@ubuntu:~/udp$ cat makefile 
.SUFFIXES: .cpp .o

CC=g++

SRCS=myudp.cpp	
OBJS=$(SRCS:.cpp=.o)

OUT=libmyudp.so

all: $(OBJS)
	$(CC) -o $(OUT) $(OBJS) -shared
	@echo '^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^'

.cpp.o: 
	$(CC) -Wall -fPIC -D__UNIX -o $@ -c $<

clean:
	-rm -f $(OBJS)
	-rm -f core*



代码左边要么顶格,要么tab,没有空格。

但是51cto会自动将tab转为4个空格



chunli@ubuntu:~/udp$ cat myudp.cpp 

// myudp.cpp : 定义 DLL 应用程序的导出函数。
//

#include <string.h>
#include "stdafx.h"

#ifndef __UNIX
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma warning(disable:4996)
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define SOCKET int
#endif

SOCKET st = 0;//全局socket变量

void init_sosket()
{
	if (st == 0)
	{
#ifndef __UNIX
		unsigned short ver;
		WSADATA wsaData;
		ver = MAKEWORD(1, 1);
		WSAStartup(ver, &wsaData);//初始化socket
		char on = 1;
#else
		int on = 1;
#endif
		st = socket(AF_INET, SOCK_DGRAM, 0);//建立UDP socket
		setsockopt(st, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));//设置可以发送udp广播消息

	}
}

void free_socket()
{
	if (st)
	{
#ifndef __UNIX

		closesocket(st);
		WSACleanup();
#else
		close(st);
#endif
		st = 0;
	}
}

extern "C"
{
#ifndef __UNIX
	__declspec(dllexport)
#endif
		int bind_socket(unsigned short port)
	{
			init_sosket();
			struct sockaddr_in recv_addr;
			memset(&recv_addr, 0, sizeof(recv_addr));
			recv_addr.sin_family = AF_INET;
			recv_addr.sin_port = htons(port);//指定port为要连接的端口号
			recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//指定接收端IP地址为任意
			return bind(st, (struct sockaddr *) &recv_addr, sizeof(recv_addr));
		}


#ifndef __UNIX
	__declspec(dllexport)
#endif
		unsigned int recv_socket(char *buf, size_t bufsize, char *srcIP)
	{
			struct sockaddr_in addr;
			memset(&addr, 0, sizeof(addr));
#ifndef __UNIX
			int len = sizeof(addr);
#else
			socklen_t len = sizeof(addr);
#endif
			unsigned int rc = recvfrom(st, buf, bufsize, 0, (struct sockaddr *) &addr, &len);//接收到来自srcIP的消息
			strcpy(srcIP, inet_ntoa(addr.sin_addr));
			return rc;
		}

#ifndef __UNIX
	__declspec(dllexport)
#endif
		unsigned int send_socket(const char *destIP, unsigned short port, const char *buf, size_t bufsize)
	{
			init_sosket();
			struct sockaddr_in addr;
			memset(&addr, 0, sizeof(addr));
			addr.sin_family = AF_INET;
			addr.sin_port = htons(port);//指定port为要连接的端口号
			addr.sin_addr.s_addr = inet_addr(destIP);//指定IP为要连接的IP地址	
			return sendto(st, buf, bufsize, 0, (struct sockaddr *) &addr, sizeof(addr));//向指定IP发送消息
		}
}
chunli@ubuntu:~/udp$ cat myudp.h 



#ifndef __MYUDP_H
#define __MYUDP_H
int bind_socket(unsigned short port);
unsigned int recv_socket(char *buf, size_t bufsize, char *srcIP);
unsigned int send_socket(const char *destIP, unsigned short port, const char *buf, size_t bufsize);

#endif
chunli@ubuntu:~/udp$ cat stdafx.h 



// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#ifndef __UNIX

#pragma once
#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             //  从 Windows 头文件中排除极少使用的信息
// Windows 头文件: 
#include <windows.h>
#endif

// TODO:  在此处引用程序需要的其他头文件