當前位置:首頁 » 操作系統 » socket編程源碼

socket編程源碼

發布時間: 2022-09-08 00:30:28

1. socket java 源代碼

很久以前做的了,啟動程序兩次,在單選框中選伺服器點連接(一定要先點伺服器-連接),在在另外一個界面中選客戶端點連接;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class QQ extends JFrame implements ActionListener{
public static void main(String args[]){
QQ qq=new QQ();

}
String input;
ServerSocket ss;
Socket s1,s2;
PrintWriter pw;
BufferedReader br;
private server s;
private client cc;
private JLabel l1,l2,l3,l4,l5;
private JRadioButton jb[]=new JRadioButton[2];
private JTextField jf1,jf2,jf3;
private JButton j1,j2,j3;
private JTextArea ja;
public QQ(){
super("聊天");
Container c=getContentPane();
c.setLayout(null);
l1=new JLabel("TCP通信程序");
l1.setFont(new Font("宋體",Font.BOLD,16));
l1.setBackground(Color.black);
l1.setSize(2000,20);
l1.setLocation(10,10);
c.add(l1);
String str1[]={"服務端","客戶端"};

ButtonGroup bg=new ButtonGroup();
for(int x=0;x<str1.length;x++)
{
jb[x]=new JRadioButton(str1[x]);
jb[x].setFont(new Font("宋體",Font.BOLD,15));
jb[x].setForeground(Color.black);
jb[x].setSize(80,40);
jb[x].setLocation(10+x*80,37);
bg.add(jb[x]);
c.add(jb[x]);
}
jb[0].setSelected(true);

l2=new JLabel("連接主機IP");
l2.setFont(new Font("宋體",Font.BOLD,16));
l2.setBackground(Color.black);
l2.setSize(120,20);
l2.setLocation(20, 80);
c.add(l2);

jf1=new JTextField("127.0.0.1");
jf1.setSize(220,30);
jf1.setLocation(120, 80);
c.add(jf1);

jf3=new JTextField("離線");
jf3.setSize(150,30);
jf3.setLocation(280, 40);
c.add(jf3);

l5=new JLabel("連接狀態:");
l5.setFont(new Font("宋體",Font.BOLD,16));
l5.setBackground(Color.black);
l5.setSize(120,20);
l5.setLocation(200, 47);
c.add(l5);

j1=new JButton("連接");
j1.setSize(110,20);
j1.setLocation(360,85);
j1.addActionListener(this);
c.add(j1);

l3=new JLabel("接收到的信息");
l3.setFont(new Font("宋體",Font.BOLD,16));
l3.setBackground(Color.black);
l3.setSize(120,20);
l3.setLocation(20, 130);
c.add(l3);

ja=new JTextArea();
ja.setSize(250,200);
ja.setLocation(130, 130);
c.add(ja);

l4=new JLabel("發送信息");
l4.setFont(new Font("宋體",Font.BOLD,16));
l4.setBackground(Color.black);
l4.setSize(120,20);
l4.setLocation(20, 340);
c.add(l4);

jf2=new JTextField("gf");
jf2.setSize(220,30);
jf2.setLocation(120, 340);
c.add(jf2);

j2=new JButton("發送信息");
j2.setSize(110,20);
j2.setLocation(360,350);
j2.addActionListener(this);
c.add(j2);

j3=new JButton("結束連接");
j3.setSize(110,20);
j3.setLocation(360,110);
j3.addActionListener(this);
c.add(j3);
s=new server();
cc=new client();
j3.setEnabled(false);
j2.setEnabled(false);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,450);
setVisible(true);
setLocation(300,300);
}

public void actionPerformed(ActionEvent e) {
// TODO 自動生成方法存根

if(e.getSource()==j1)
{
try{
if(jb[0].isSelected()==true)
{
input="";
s.start();
}
else {
input="";
cc.start();
}
}
catch(Exception ee)
{
jf3.setText("發生錯誤");
}
}

if(e.getSource()==j2)
{

pw.write(jf2.getText()+"\n");

pw.flush();

}

if(e.getSource()==j3)
{
try
{
if(jb[0].isSelected()==true)
{ s1.close();
jf3.setText("離線");

j2.setEnabled(false);
j3.setEnabled(false);

}

else
{

s2.close();
jf3.setText("離線");
j2.setEnabled(false);
j3.setEnabled(false);

}
}
catch (Exception e1) {
// TODO 自動生成 catch 塊

}

}

}

class server extends Thread{
public void run(){
try {

j1.setEnabled(false);

jf3.setText("正在連接中@");

ss=new ServerSocket(4000);
s1=ss.accept();

br=new BufferedReader(new InputStreamReader(s1.getInputStream()));
pw=new PrintWriter(s1.getOutputStream(),true);
// bs=new BufferedOutputStream(os);
while(true){
if(ss.isBound()==true){

jf3.setText("連接成功");
j2.setEnabled(true);
j3.setEnabled(true);
break;
}
}
while(true)
{
input=br.readLine();

if(input.length()>0){
ja.append(input);
ja.append("\n");

}

}

} catch (Exception e) {
// TODO 自動生成 catch 塊

}

}

}

class client extends Thread{
public void run(){
try {

j1.setEnabled(false);
jf3.setText("正在連接中@");
s2=new Socket(InetAddress.getByName(jf1.getText()),4000);

// s2=new Socket();
// s2.connect(new InetSocketAddress(jf1.getText(),21),1000);
br=new BufferedReader(new InputStreamReader(s2.getInputStream()));
pw=new PrintWriter(s2.getOutputStream(),true);

// bs=new BufferedOutputStream(os);
while(true){
if(s2.isConnected()==true){
jf3.setText("連接成功");
j2.setEnabled(true);
j3.setEnabled(true);
break;

}

}

input="";
while(true){
input=br.readLine();
if(input.length()>0)
{

ja.append(input);

}
}

} catch (Exception e) {
// TODO 自動生成 catch 塊

}
}

}
}

2. java Socket編程 為什麼起多個客戶端之後就會卡死在那(源碼如下)

伺服器端: package chat_01; import java.awt.BorderLayout; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JFrame; import javax.swing.JTextArea; public class ChatServer extends JFrame { private static final long serialVersionUID = 1L; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private JTextArea jta; private DataInputStream dis; private DataOutputStream dos; private ServerSocket serverSocket; private String dateString; public static void main(String[] args) { ChatServer server = new ChatServer(); server.showServer(); server.send(); } public void showServer() { jta = new JTextArea(); this.setLayout(new BorderLayout()); this.add(jta, BorderLayout.CENTER); this.setLocation(300, 100); this.setSize(500, 400); this.setTitle("伺服器端"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void send() { try { serverSocket = new ServerSocket(8007); while (true) { Socket socket = serverSocket.accept(); System.out.println("一個用戶連接上了。。。"); dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); new Thread(new ClientThread()).start(); } } catch (IOException e) { e.printStackTrace(); } } private class ClientThread implements Runnable { public void run() { while (true) { try { Date currentTime = new Date(); dateString = format.format(currentTime); String str = dis.readUTF(); dos.writeUTF(str); jta.append(dateString + "
" + str + "
"); }catch (IOException e) { e.printStackTrace(); } } } } } 客戶端: package chat_01; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.*; public class ChatClient extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextArea jta; private JTextField jtf; private JButton jbt; DataOutputStream dos; DataInputStream dis; public static void main(String[] args) { ChatClient client = new ChatClient(); client.connected(); client.showClient(); } public void showClient() { jta = new JTextArea(); jta.setEditable(false); jtf = new JTextField(); jbt = new JButton("發送"); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(jtf, BorderLayout.CENTER); panel.add(jbt, BorderLayout.EAST); this.setLayout(new BorderLayout()); this.add(jta, BorderLayout.CENTER); this.add(panel, BorderLayout.SOUTH); jtf.addActionListener(this); jbt.addActionListener(this); this.setLocation(300, 100); this.setSize(500, 400); this.setTitle("客戶端"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date currentTime = new Date(); String dateString = format.format(currentTime); String text = jtf.getText(); jta.append(dateString + "
"); jta.append(text + "
"); jtf.setText(""); jtf.grabFocus();// 文本框獲取游標(焦點) try { dos.writeUTF(text); dos.flush(); jta.append(dis.readUTF()); System.out.println(text + "client"); } catch (IOException e1) { e1.printStackTrace(); } } public void connected() { try { Socket socket = new Socket("127.0.0.1", 8007); dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

3. linux下socket 網路編程(客戶端向伺服器端發送文件) 求源代碼 大哥大姐幫幫忙 ,。。謝謝

簡單的:

//client
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>

#define ERR() \
do { perror(""); printf("%d -- func: %s\n", __LINE__, __FUNCTION__); return -1; } while(0)

int main (int argc, char *argv[])
{
int sockfd, fd, nbytes;
struct sockaddr_in addr;
struct stat f_stat;

if (argc < 3) {
ERR();
}

fd = open (argv[2], O_RDONLY);

if (fd == -1) {
ERR();
}

sockfd = socket (AF_INET, SOCK_DGRAM, 0);

if (sockfd == -1) {
ERR();
}

addr.sin_family = AF_INET;
addr.sin_port = htons (5678);
inet_aton (argv[1], &addr.sin_addr);

if (-1 == lstat (argv[2], &f_stat) ) {
ERR();
}

char *buff = (char *) mmap (NULL, f_stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
nbytes = sendto (sockfd, (void *) buff, f_stat.st_size, 0, (struct sockaddr *) &addr, (socklen_t) sizeof (addr) );

if (nbytes == -1) {
ERR();
}

munmap (buff, f_stat.st_size);
close (fd);
return 0;
}

===================================

//server
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>

#define SIZE 512
#define ERR() \
do { perror(""); printf("%d -- func: %s\n", __LINE__, __FUNCTION__); return -1; } while(0)

int main (void)
{
int sockfd, fd, nbytes, ret;
socklen_t addr_len;
char buff[SIZE];
struct sockaddr_in addr;
sockfd = socket (AF_INET, SOCK_DGRAM, 0);

if (sockfd == -1) {
ERR();
}

memset ( (void *) &addr, 0, sizeof (addr) );
addr.sin_family = AF_INET;
addr.sin_port = htons (5678);
addr.sin_addr.s_addr = htonl (INADDR_ANY);
addr_len = sizeof (addr);
ret = bind (sockfd, (const struct sockaddr *) &addr, addr_len);

if (ret == -1) {
ERR();
}

printf ("#### Waiting For Data ... ####\n");
fd = creat ("recv", S_IWUSR | S_IRUSR);
nbytes = recvfrom (sockfd, (void *) buff, SIZE, 0, (struct sockaddr *) &addr, (socklen_t *) &addr_len);

if (nbytes == -1) {
ERR();
}

write (fd, (void *) buff, nbytes);
close (fd);
return 0;
}

4. Android socket源碼解析(三)socket的connect源碼解析

上一篇文章著重的聊了socket服務端的bind,listen,accpet的邏輯。本文來著重聊聊connect都做了什麼?

如果遇到什麼問題,可以來本文 https://www.jianshu.com/p/da6089fdcfe1 下討論

當服務端一切都准備好了。客戶端就會嘗試的通過 connect 系統調用,嘗試的和服務端建立遠程連接。

首先校驗當前socket中是否有正確的目標地址。然後獲取IP地址和埠調用 connectToAddress 。

在這個方法中,能看到有一個 NetHooks 跟蹤socket的調用,也能看到 BlockGuard 跟蹤了socket的connect調用。因此可以hook這兩個地方跟蹤socket,不過很少用就是了。

核心方法是 socketConnect 方法,這個方法就是調用 IoBridge.connect 方法。同理也會調用到jni中。

能看到也是調用了 connect 系統調用。

文件:/ net / ipv4 / af_inet.c

在這個方法中做的事情如下:

注意 sk_prot 所指向的方法是, tcp_prot 中 connect 所指向的方法,也就是指 tcp_v4_connect .

文件:/ net / ipv4 / tcp_ipv4.c

本質上核心任務有三件:

想要能夠理解下文內容,先要明白什麼是路由表。

路由表分為兩大類:

每個路由器都有一個路由表(RIB)和轉發表 (fib表),路由表用於決策路由,轉發表決策轉發分組。下文會接觸到這兩種表。

這兩個表有什麼區別呢?

網上雖然給了如下的定義:

但實際上在Linux 3.8.1中並沒有明確的區分。整個路由相關的邏輯都是使用了fib轉發表承擔的。

先來看看幾個和FIB轉發表相關的核心結構體:

熟悉Linux命令朋友一定就能認出這裡面大部分的欄位都可以通過route命令查找到。

命令執行結果如下:

在這route命令結果的欄位實際上都對應上了結構體中的欄位含義:

知道路由表的的內容後。再來FIB轉發表的內容。實際上從下面的源碼其實可以得知,路由表的獲取,實際上是先從fib轉發表的路由字典樹獲取到後在同感加工獲得路由表對象。

轉發表的內容就更加簡單

還記得在之前總結的ip地址的結構嗎?

需要進行一次tcp的通信,意味著需要把ip報文准備好。因此需要決定源ip地址和目標IP地址。目標ip地址在之前通過netd查詢到了,此時需要得到本地發送的源ip地址。

然而在實際情況下,往往是面對如下這么情況:公網一個對外的ip地址,而內網會被映射成多個不同內網的ip地址。而這個過程就是通過DDNS動態的在內存中進行更新。

因此 ip_route_connect 實際上就是選擇一個緩存好的,通過DDNS設置好的內網ip地址並找到作為結果返回,將會在之後發送包的時候填入這些存在結果信息。而查詢內網ip地址的過程,可以成為RTNetLink。

在Linux中有一個常用的命令 ifconfig 也可以實現類似增加一個內網ip地址的功能:

比如說為網卡eth0增加一個IPV6的地址。而這個過程實際上就是調用了devinet內核模塊設定好的添加新ip地址方式,並在回調中把該ip地址刷新到內存中。

注意 devinet 和 RTNetLink 嚴格來說不是一個存在同一個模塊。雖然都是使用 rtnl_register 注冊方法到rtnl模塊中:

文件:/ net / ipv4 / devinet.c

文件:/ net / ipv4 / route.c

實際上整個route模塊,是跟著ipv4 內核模塊一起初始化好的。能看到其中就根據不同的rtnl操作符號注冊了對應不同的方法。

整個DDNS的工作流程大體如下:

當然,在tcp三次握手執行之前,需要得到當前的源地址,那麼就需要通過rtnl進行查詢內存中分配的ip。

文件:/ include / net / route.h

這個方法核心就是 __ip_route_output_key .當目的地址或者源地址有其一為空,則會調用 __ip_route_output_key 填充ip地址。目的地址為空說明可能是在回環鏈路中通信,如果源地址為空,那個說明可能往目的地址通信需要填充本地被DDNS分配好的內網地址。

在這個方法中核心還是調用了 flowi4_init_output 進行flowi4結構體的初始化。

文件:/ include / net / flow.h

能看到這個過程把數據中的源地址,目的地址,源地址埠和目的地址埠,協議類型等數據給記錄下來,之後內網ip地址的查詢與更新就會頻繁的和這個結構體進行交互。

能看到實際上 flowi4 是一個用於承載數據的臨時結構體,包含了本次路由操作需要的數據。

執行的事務如下:

想要弄清楚ip路由表的核心邏輯,必須明白路由表的幾個核心的數據結構。當然網上搜索到的和本文很可能大為不同。本文是基於LInux 內核3.1.8.之後的設計幾乎都沿用這一套。

而內核將路由表進行大規模的重新設計,很大一部分的原因是網路環境日益龐大且復雜。需要全新的方式進行優化管理系統中的路由表。

下面是fib_table 路由表所涉及的數據結構:

依次從最外層的結構體介紹:

能看到路由表的存儲實際上通過字典樹的數據結構壓縮實現的。但是和常見的字典樹有點區別,這種特殊的字典樹稱為LC-trie 快速路由查找演算法

這一篇文章對於快速路由查找演算法的理解寫的很不錯: https://blog.csdn.net/dog250/article/details/6596046

首先理解字典樹:字典樹簡單的來說,就是把一串數據化為二進制格式,根據左0,右1的方式構成的。

如圖下所示:

這個過程用圖來展示,就是沿著字典樹路徑不斷向下讀,比如依次讀取abd節點就能得到00這個數字。依次讀取abeh就能得到010這個數字。

說到底這種方式只是存儲數據的一種方式。而使用數的好處就能很輕易的找到公共前綴,在字典樹中找到公共最大子樹,也就找到了公共前綴。

而LC-trie 則是在這之上做了壓縮優化處理,想要理解這個演算法,必須要明白在 tnode 中存在兩個十分核心的數據:

這負責什麼事情呢?下面就簡單說說整個lc-trie的演算法就能明白了。

當然先來看看方法 __ip_dev_find 是如何查找

文件:/ net / ipv4 / fib_trie.c

整個方法就是通過 tkey_extract_bits 生成tnode中對應的葉子節點所在index,從而通過 tnode_get_child_rcu 拿到tnode節點中index所對應的數組中獲取葉下一級別的tnode或者葉子結點。

其中查找index最為核心方法如上,這個過程,先通過key左移動pos個位,再向右邊移動(32 - bits)演算法找到對應index。

在這里能對路由壓縮演算法有一定的理解即可,本文重點不在這里。當從路由樹中找到了結果就返回 fib_result 結構體。

查詢的結果最為核心的就是 fib_table 路由表,存儲了真正的路由轉發信息

文件:/ net / ipv4 / route.c

這個方法做的事情很簡單,本質上就是想要找到這個路由的下一跳是哪裡?

在這裡面有一個核心的結構體名為 fib_nh_exception 。這個是指fib表中去往目的地址情況下最理想的下一跳的地址。

而這個結構體在上一個方法通過 find_exception 獲得.遍歷從 fib_result 獲取到 fib_nh 結構體中的 nh_exceptions 鏈表。從這鏈表中找到一模一樣的目的地址並返回得到的。

文件:/ net / ipv4 / tcp_output.c

5. linux socket網路編程學完看哪些源碼

要看的東西實在是太多了,不如來培訓一下吧。

6. 使用c++6.0,基於Socket開發網路音頻點播程序。求源碼!

「對圖中的那些函數,我這里稍加解釋一下。」 int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 功能是初始化Windows Socket Dll,在Windows下必須使用它。參數:「wVersionRequested」表示版本,可以是1.1、2.2等;「lpWSAData」指向WSADATA數據結構的指針。int socket(int family, int type, int protocol); 功能是建立Socket,返回以後會用到的Socket值。如果錯誤,返回-1。參數:「int family」參數指定所要使用的通信協議,取以下幾個值:AF_UNIX(Unix內部協議)、AF_INET(Internet協議)、AF_NS Xerox(NS協議)、AF_IMPLINK(IMP連接層),在Windows下只能把「AF」設為「AF_INET」;「int type」參數指定套接字的類型,取以下幾個值:SOCK_STREAM(流套接字)、SOCK_DGRAM (數據報套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(順序包套接字);「int protocol」參數通常設置為0。int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 功能是把套接字和機器上一定的埠關聯起來。參數:「sockfd」是調用socket()返回的套接字值;「my_addr」是指向數據結構struct sockaddr的指針,它保存你的地址,即埠和IP地址信息;「addrlen」設置為sizeof(struct sockaddr)。 int listen(int sockfd, int backlog); 功能是服務端監聽一個埠,直到accept()。在發生錯誤時返回-1。參數:「sockfd」是調用socket()返回的套接字值;「backlog」是允許的連接數目。大多數系統的允許數目是20,也可以設置為5到10。 int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 功能是客戶端連接服務端監聽的埠。參數:「sockfd」是調用socket()返回的套接字值;「serv_addr」保存著目的地埠和IP 地址的數據結構struct sockaddr;「addrlen」設置為sizeof(struct sockaddr)。 int accept(int sockfd, void *addr, int *addrlen); 功能是服務端接受客戶端的連接請求,並返回一個新的套接字,以後服務端的數據傳輸就使用這個新的套接字。如果有錯誤,返回-1。參數:「sockfd」是和listen()中一樣的套接字值;「addr」是個指向局部的數據結構sockaddr_in的指針;「addrlen」設置為sizeof(struct sockaddr_in)。int send(int sockfd, const void *msg, int len, int flags);int recv(int sockfd, void *buf, int len, unsigned int flags);功能是用於流式套接字或數據報套接字的通訊,我們數據的真正傳輸就由它們完成。參數:「sockfd」是發/收數據的套接字值;「msg」指向你想發送的數據的指針;「buf」是指向接收數據存放的地址;「len」是數據的長度;「flags」設置為 0。int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);功能和send、recv類似,不過是用於無連接數據報套接字的傳輸。 int closesocket(int sockfd) 功能是關閉套接字。參數「sockfd」為要關閉的套接字值。程序:「這里的目的是讓大家對Socket編程有個整體了解。不用怕,程序我會詳細解釋的,首先是服務端的程序。其流程是: socket()→bind()→listen→accept()→recv()/send()→closesocket() 具體代碼如下:」★#include #include #pragma comment(lib,"Ws2_32")#define MYPORT 830 /*定義用戶連接埠*/ #define BACKLOG 10 /*多少等待連接控制*/ int main() { int sockfd, new_fd; /*定義套接字*/ struct sockaddr_in my_addr; /*本地地址信息 */ struct sockaddr_in their_addr; /*連接者地址信息*/ int sin_size; WSADATA ws; WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll //建立socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //如果建立socket失敗,退出程序 printf("socket error\n"); exit(1); } //bind本機的MYPORT埠 my_addr.sin_family = AF_INET; /* 協議類型是INET */ my_addr.sin_port = htons(MYPORT); /* 綁定MYPORT埠*/ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本機IP*/ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) { //bind失敗,退出程序 printf("bind error\n"); closesocket(sockfd); exit(1); } //listen,監聽埠 if (listen(sockfd, BACKLOG) == -1) { //listen失敗,退出程序 printf("listen error\n"); closesocket(sockfd); exit(1); } printf("listen"); //等待客戶端連接 sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { printf("accept error\n"); closesocket(sockfd); exit(1); } printf("\naccept!\n"); //有連接,發送ww0830字元串過去 if (send(new_fd, "ww0830\n", 14, 0) == -1) { printf("send error"); closesocket(sockfd); closesocket(new_fd); exit(1); } printf("send ok!\n"); //成功,關閉套接字 closesocket(sockfd); closesocket(new_fd); return 0;}對服務端程序的流程概括:先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws); 然後建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 再bind本機的MYPORT埠:my_addr.sin_family = AF_INET; /* 協議類型是INET */ my_addr.sin_port = htons(MYPORT); /* 綁定MYPORT埠 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本機IP */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) 接下來監聽埠: listen(sockfd, BACKLOG) 如果有客戶端的連接請求,接收它: new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size) 最後發送ww0830字元串過去: send(new_fd, "ww0830\n", 14, 0) 收尾工作,關閉socket: closesocket(sockfd); closesocket(new_fd); 」編譯、執行,就會一直監聽830埠客戶端程序了。其流程是: socket()→connect()→send()/recv()→closesocket() 比服務端更簡單吧!其實現代碼如下:」★#include #include #include #pragma comment(lib,"Ws2_32") #define PORT 830 /* 客戶機連接遠程主機的埠 */ #define MAXDATASIZE 100 /* 每次可以接收的最大位元組 */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct sockaddr_in their_addr; /* 對方的地址埠信息 */ if (argc != 2) { //需要有服務端ip參數 fprintf(stderr,"usage: client hostname\n"); exit(1); } WSADATA ws;WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ //如果建立socket失敗,退出程序 printf("socket error\n"); exit(1); } //連接對方their_addr.sin_family = AF_INET; /* 協議類型是INET */ their_addr.sin_port = htons(PORT); /* 連接對方PORT埠 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 連接對方的IP */ if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){ //如果連接失敗,退出程序 printf("connet error\n"); closesocket(sockfd); exit(1); } //接收數據,並列印出來if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { //接收數據失敗,退出程序 printf("recv error\n"); closesocket(sockfd); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); closesocket(sockfd); return 0; } 對客戶端程序的流程概括:首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws); 然後建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 接著連接伺服器方:their_addr.sin_family = AF_INET; /* 協議類型是INET */ their_addr.sin_port = htons(PORT); /* 連接對方PORT埠 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 連接對方的IP */ connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) 連接成功就接收數據: recv(sockfd, buf, MAXDATASIZE, 0) 最後把收到的數據列印出來並關閉套接字: printf("Received: %s",buf); closesocket(sockfd); 編譯結束後,運行服務端,然後。客戶端 服務端IP 回車你會看到服務端發來得數據。那麼基本的點對點通信就沒問題了。只要兩台機器同時包含服務端和客戶端,就可以互相通信了。當然,你也可以將服務端和客戶端分開做,專門一個伺服器負責用戶登錄和轉發消息。流程如下:A客戶端發登錄消息-----》伺服器伺服器驗證發送用戶消息----》客戶端A客戶端想發消息給B客戶端----》先發給服務端伺服器得到消息查詢B客戶端IP並轉發消息。(或者B客戶端循環發消息詢問伺服器有無消息)通信結束。

7. linux下socket 網路編程(客戶端向伺服器端發送文件) 求源代碼 大哥大姐幫幫忙 。。謝謝

server:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

#define MAXDATASIZE 1024
#define SERVPORT 19999
#define BACKLOG 10

int SendFileToServ(const char *path, const char *FileName, const char *ip)
{
#define PORT 20002
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[128] = {0};
struct sockaddr_in serv_addr;
FILE *fp;
sprintf(filepath, "%s%s", path, FileName);

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return 1;
}
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
inet_aton(ip, &serv_addr.sin_addr);
int IErrCount = 0;
again:
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
if (5 == IErrCount)
return 1;
IErrCount++;
perror("connect");
sleep(2);
goto again;
}
//if ((fp = fopen(FileName, "rb")) == NULL)
if ((fp = fopen(filepath, "rb")) == NULL)
{
perror("fopen ");
return 1;
}
recvbytes = write(sockfd, FileName, strlen(FileName));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (!memcmp(buf, "sendmsg", 7))
{
while(fgets(send_str, MAXDATASIZE, fp))
{
recvbytes = write(sockfd, send_str, strlen(send_str));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (recvbytes <= 0)
{
fclose(fp);
close(sockfd);
return 1;
}
if (memcmp(buf, "goon", 4))
{
fclose(fp);
close(sockfd);
return 1;
}
}
recvbytes = write(sockfd, "end", 3);
}
else
{
fclose(fp);
close(sockfd);
return 1;
}
memset(buf, 0, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) <= 0)
{
close(sockfd);
return 2;
}
char *Eptr = "nginx reload error";
//printf("bf[%s]\n", buf);
int ret;
ret = strncmp(buf, Eptr, strlen(Eptr));
//printf("%d\n", ret);
if (!ret)
{
close(sockfd);
return 2;
}

close(sockfd);
return 0;
}

int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// 請在循環體中判斷,如果re_conf == 1,請再次載入配置文件。
}
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/apuserv.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}

int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)
{
sscanf(buf, "%s %s %s", pth, FileName, str);
printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str);
return 0;
}

int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"apuserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "apuserv is already running\n");
syslog(LOG_INFO,"apuserv is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
int nret;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
char str[16] = {0};
char FileName[128] = {0};
char path[128] = {0};
MyHandleBuff(buff, str, FileName, path);
if (recvbytes > 0)
{
nret = SendFileToServ(path, FileName, str);
printf("nret[%d]\n", nret);
if (1 == nret)
write(client_fd, "send file error", 15);
else if(2 == nret)
write(client_fd, "reload nginx error", 18);
else
write(client_fd, "succ", 4);
}
close(client_fd);
}
}
_________________________________________________
client:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

#define MAXDATASIZE 1024
#define SERVPORT 20002
#define BACKLOG 10

int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// ????·???????1nf == 1£???′μ?????

static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/dstserver.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}

int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"dstserver start....");

while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "dstserver is already running\n");
syslog(LOG_INFO,"dstserver is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}

char filepath[MAXDATASIZE]= {0};
FILE *fp;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
sprintf(filepath, "/etc/nginx/url_rule/%s", buff);
if ((fp = fopen(filepath, "wb")) == NULL)
{
perror("fopen");
close(client_fd);
continue;
}
write(client_fd, "sendmsg", 7);
while(read(client_fd, buff, MAXDATASIZE))
{
if (!memcmp(buff, "end", 3))
{
fclose(fp);
break;
}
else
{
fprintf(fp, "%s", buff);
write(client_fd, "goon", 4);
}
}
//system("nginx -s reload");
char *Sptr = "nginx reload succ";
char *Eptr = "nginx reload error";
int ret;
ret = system("nginx -s reload");
printf("ret[%d]\n", ret);
if (ret != 0)
{
write(client_fd, Eptr, strlen(Eptr));
}
else
{
write(client_fd, Sptr, strlen(Sptr));
}
close(client_fd);
}
}

以前寫的:內容忘記了。不是很復雜你可以自己看!

8. 求一個socket聊天程序源碼 C語言的

通過socket編程自己寫一個唄,可以學習一下socket編程方面的知識

9. C# socket 聊天的 C/s程序 源碼

//"開始"按鈕事件
privatevoidbutton1_Click(objectsender,System.EventArgse){
//取得預保存的文件名
stringfileName=textBox3.Text.Trim();
//遠程主機
stringhostName=textBox1.Text.Trim();
//埠
intport=Int32.Parse(textBox2.Text.Trim());
//得到主機信息
IPHostEntryipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[]ipAddr=ipInfo.AddressList;
//得到ip
IPAddressip=ipAddr[0];
//組合出遠程終結點
IPEndPointhostEP=newIPEndPoint(ip,port);
//創建Socket實例
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
//嘗試連接
socket.Connect(hostEP);
}
catch(Exceptionse)
{
MessageBox.Show("連接錯誤"+se.Message,"提示信息
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//發送給遠程主機的請求內容串
stringsendStr="GET/HTTP/1.1 Host:"+hostName+
" Connection:Close ";
//創建bytes位元組數組以轉換發送串
byte[]bytesSendStr=newbyte[1024];
//將發送內容字元串轉換成位元組byte數組
bytesSendStr=Encoding.ASCII.GetBytes(sendStr);
try
{
//向主機發送請求
socket.Send(bytesSendStr,bytesSendStr.Length,0);
}
catch(Exceptionce)
{
MessageBox.Show("發送錯誤:"+ce.Message,"提示信息
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//聲明接收返回內容的字元串
stringrecvStr="";
//聲明位元組數組,一次接收數據的長度為1024位元組
byte[]recvBytes=newbyte[1024];
//返回實際接收內容的位元組數
intbytes=0;
//循環讀取,直到接收完所有數據
while(true)
{
bytes=socket.Receive(recvBytes,recvBytes.Length,0);
//讀取完成後退出循環
if(bytes〈=0)
break;
//將讀取的位元組數轉換為字元串
recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
}
//將所讀取的字元串轉換為位元組數組
byte[]content=Encoding.ASCII.GetBytes(recvStr);
try
{
//創建文件流對象實例
FileStreamfs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
//寫入文件
fs.Write(content,0,content.Length);
}
catch(Exceptionfe)
{
MessageBox.Show("文件創建/寫入錯誤:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//禁用Socket
socket.Shutdown(SocketShutdown.Both);
//關閉Socket
socket.Close();
}
}



熱點內容
皇家農場腳本 發布:2024-05-03 16:46:41 瀏覽:458
順序存儲鏈式存儲 發布:2024-05-03 16:46:41 瀏覽:879
電腦配置低可以玩什麼fps游戲 發布:2024-05-03 16:46:39 瀏覽:421
qq刷紅包腳本 發布:2024-05-03 16:16:54 瀏覽:769
c服務編譯耗時優化原理及實例 發布:2024-05-03 15:35:26 瀏覽:15
ue編程 發布:2024-05-03 15:34:40 瀏覽:610
經典的c語言程序 發布:2024-05-03 15:03:24 瀏覽:859
工程加密網 發布:2024-05-03 14:59:55 瀏覽:292
吃冰球解壓 發布:2024-05-03 14:59:10 瀏覽:895
編譯晶元發燙 發布:2024-05-03 14:59:05 瀏覽:549